|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 27, 2003 13:13:46 Программа создает заранее не извесное число потоков <= 26. Как узнать момент когда все потоки точно завершены ? Если можно, кусок кода :) ? Спасибо. |
|
|
Дата: Янв 27, 2003 18:28:26 После создания потока ты получаешь его хендл. Запихиваешь все хендлы в массив Handles и создаешь еще один поток, который будет ждать. Вызываешь в нем WaitForMultipleObjects так: invoke WaitForMultipleObjects, nCount, addr Handles, TRUE, INFINITE где nCount кол-во хендлов в массиве Handles. Если WaitForMultipleObjects вернется, то значит все потоки перечисленные в массиве Handles завершились. Закрываешь их хендлы - они те больше не нужны и делаешь че те надо. |
|
|
Дата: Янв 28, 2003 17:24:30 ... извините за глупый вопрос :) , а как объявить массив Handles ? |
|
|
Дата: Янв 28, 2003 18:40:23 Кхым... кхым... Прости за встречный вопрос, и только без обид, но как ты собираешься писать многопоточное приложение если даже не можешь объявить массив? .data? Handles HANDLE 26 dup(?) Если еще вопросы есть не тушуйся. |
|
|
Дата: Янв 28, 2003 19:04:51 ... лучше пусть все знают что я балбес и я тут что-то напишу, чем буду гордо сидеть и ничему не научусь ...а как обратиться к элементам массива Handles, тоесть как в MASM-е будет hThreads[1] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, InitStr2, 0,&uThreadIDs[1]); Потерпите меня еще разок :) |
|
|
Дата: Янв 29, 2003 13:40:30 Вот. Что-то вроде этого. Код есно не проверял - мог где-то и ошибиться. .data? uThreadCounter UINT ? hThreads HANDLE 26 dup(?) uThreadIDs DWORD 26 dup(?) dwWaitingThreadID DWORD ? hWaitingThread HANDLE ? .code ; . . . ; Где-то в начале проги инициализируешь счетчик потоков нулем ; Можно этого и не делать, т.к. .data? и так нулями инициализируется and uThreadCounter, 0 SomeProc proc mov eax, uThreadCounter lea eax, uThreadIDs[eax*(type uThreadIDs)] ; или просто uThreadIDs[eax*4] invoke CreateThread, NULL, 0, offset ThreadFunc, InitStr2, 0, eax .if eax != NULL mov eax, uThreadCounter lea eax, hThreads[eax*(type hThreads)] ; или просто hThreads[eax*4] inc uThreadCounter .endif ; . . . invoke CreateThread, NULL, 0, offset WaitingThread, 0, 0, addr dwWaitingThreadID .if eax != NULL mov hWaitingThread, eax .else ; большой облом .endif ; . . . WaitingThread proc dwParam:DWORD ; Ждем пока завершатся все потоки invoke WaitForMultipleObjects, uThreadCounter, addr hThreads, TRUE, INFINITE .if eax == STATUS_WAIT_0 ; все ожидаемые потоки завершились mov ebx, uThreadCounter .while ebx != -1 dec ebx ; закрываем их хендлы invoke CloseHandle, hThreads[ebx*(type hThreads)] ; или просто hThreads[ebx*4] .endw and uThreadCounter, 0 ; что-то делаем .endif ret WaitingThread endp Когда WaitingThread не нужен станет его тоже надо прибить. |
|
|
Дата: Янв 29, 2003 14:04:48 ... пою хвалу wasm-му.ru и Four-F особо :0 Действительно СПАСИБО! Нет в инете доходчивого примера на этот счет, или не знаю где искать masm - исходники. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104 |