IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Синхронизация работы экземпляров приложения, VC++ 2008 EE
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Требуется разработать приложение, которое, будучи запущенным несколько раз, выполняет отчёт до 5-ти, затем ждёт, пока другой экземпляр этого приложения сосчитает до 5-ти, после чего продолжает свой отчёт. Счёт выполняют все запущенные экземпляры приложения по очереди..

Воть..
начала с того, что запускаю эти самые экземпляры в отдельных потоках..трудность на этом этапе в том, что не пойму, что должно быть 3-им параметром в CreateThread..Объясните пожалуйста!


#define MAX_THREADS 3
//........
HANDLE hThreadArray[MAX_THREADS];
DWORD dwThreadIdArray[MAX_THREADS];

TCHAR szFileName[260];
OPENFILENAME ofn;
LPCWSTR lpFilter=TEXT("Executive\0*.EXE\0");
ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME) ;
ofn.hwndOwner=hWndMain;
ofn.hInstance=NULL;
ofn.lpstrFile = szFileName;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFileName);
ofn.lpstrFilter = lpFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) && i<=3 )
{
i++;
hThreadArray[i] = CreateThread(
NULL,
0,
//???,
NULL,
0,
&dwThreadIdArray[i]);

}




Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Теперь, как я полагаю, должен осуществляться процесс счёта и ожидание, пока остальные экземпляры посчитают
Правильно полагаешь.

Цитата
И главный вопрос: что вообще нужно понимать под "посчитает до 5-ти"?
Ну вот именно это и понимать: локальная переменная в функции потока меняет значение от 0 до 4 (или от 1 до 5). Чтобы было видно, что она-таки его меняет, можно, скажем, выводить текущее её (переменной) значение в какой-нибудь listbox. Чтобы заодно удостовериться, что потоки не "накладываются" один на другой, то есть, что не происходит так: переменная потока_1 становится = 1; переменная потока_1 становится = 2; переменная потока_2 становится = 1; переменная потока_1 становится = 3 ... По условию это недопустимо. Пока один поток работает - остальные спят...

Цитата
И как должна выглядеть организация процесса последовательного счёта каждым экземпляром??
Вот... А теперь - самое интересное. Я не знаю, что ты там делаешь в потоке (в смысле, в том коде, который привела), но вот такой код:

bool RunMore = true;

DWORD WINAPI thread_func(LPVOID lpParam)
{
int ID = *((int *)lpParam); // ID потока, чтобы было видно, какой из потоков пишет в hListBox

while(RunMore) {
WaitForSingleObject(myEvent, INFINITE);
char s[50] = {0};
for(int i = 0; i < 5; i++) {
// считаем и показываем, что что-то происходит
sprintf(s, "thread = %d; n = %d\0", ID, i);
SendMessage(hListbox, LB_ADDSTRING, NULL, (LPARAM)s);
}
SetEvent(myEvent);
}

return 0;
}

...
// Внимание: событие - с автосбросом, а не ручное, как было у тебя !!!
myEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
int counter[THRD_COUNT] = {1, 2, 3}; // Это можно сделать и программно, я делал для простоты

for(int i = 0; i < THRD_COUNT; i++) {
hThread[i] = CreateThread(NULL, 0, thread_func, (PVOID)&counter[i], 0, &dwThreadIdArray[i]);
}
SetEvent(myEvent);
...
заставляет последовательно выполняться все потоки до тех пор, пока по какой-то причине (скажем, нажатие кнопки, как сделал я) переменная RunMore не станет = false.

Попробуй разобраться, что тут происходит, если не понятно - спрашивай.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Синхронизация работы экземпляров приложения   7.11.2008 23:05
volvo   Это должна быть точка входа (адрес) в функцию, вып…   8.11.2008 0:02
18192123   Теперь вопросы по сути задания... В качестве метод…   8.11.2008 17:38
volvo   Правильно полагаешь. Ну вот именно это и понимать…   8.11.2008 19:37
18192123   Прежде всего такой вопрос: в приведённом выше коде…   9.11.2008 1:54
volvo   Стоп... Возникает 2 вопроса: 1) если у тебя рабо…   9.11.2008 2:30
18192123   Стоп... Возникает 2 вопроса: 1) если у тебя раб…   9.11.2008 2:46
volvo   Event тоже можно использовать для межпроцессного в…   9.11.2008 3:14
18192123   Решай. Я бы сделал запуск копий пользователем. За…   9.11.2008 3:32
volvo   Что мешает тебе сделать следующее: прежде всего пр…   9.11.2008 5:53
18192123   ..как запрещается запуск второй копии приложения,…   9.11.2008 21:02
volvo   В общем, задачка интересная, вот я набросал кое-чт…   9.11.2008 21:14
18192123   В общем, задачка интересная, вот я набросал кое-ч…   9.11.2008 23:30
volvo   Не очень люблю отвечать вопросом на вопрос, но зде…   9.11.2008 23:46


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.04.2024 17:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name