1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Требуется разработать приложение, которое, будучи запущенным несколько раз, выполняет отчёт до 5-ти, затем ждёт, пока другой экземпляр этого приложения сосчитает до 5-ти, после чего продолжает свой отчёт. Счёт выполняют все запущенные экземпляры приложения по очереди..
Воть.. начала с того, что запускаю эти самые экземпляры в отдельных потоках..трудность на этом этапе в том, что не пойму, что должно быть 3-им параметром в CreateThread..Объясните пожалуйста!
Теперь, как я полагаю, должен осуществляться процесс счёта и ожидание, пока остальные экземпляры посчитают
Правильно полагаешь.
Цитата
И главный вопрос: что вообще нужно понимать под "посчитает до 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.
Попробуй разобраться, что тут происходит, если не понятно - спрашивай.
Прежде всего такой вопрос: в приведённом выше коде потоки(!) разрабатываемого приложения выполняют счёт друг за другом...по заданию нужно, чтобы экземпляры(!!) приложения этим занимались..тогда вопрос: значит ли, что выполняющиеся последовательно потоки есть те самые экземпляры приложения? или мы в потоках должны позаботиться о запуске экземпляра приложения?
Теперь по коду.. Вот создали мы объект-событие, оно занято (FALSE), теперь в цикле создаются потоки... насколько я поняла, при создании 1-го же потока мы переходим в функцию thread_func.. (или нет? и сначала всё потоки создаются??) RunMore истина, заходим в цикл - событие у нас занято (изначально), тогда WaitForSingleObject должна "усыпить" наш 1-й поток...Тогда какой поток считать будет? 2-й? но разве он уже создан? Вот тут запуталась..Объясните пожалуйста..!