· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Вопрос о потоках

Посл.отвђт Сообщен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