Уроки Iczelion'а




Урок 16. Объект события - часть 4


invoke EnableMenuItem,hMenu,IDM_START_THREAD,MF_ENABLED invoke EnableMenuItem,hMenu,IDM_STOp_THREAD,MF_GRAYED jmp Threadproc ret

Threadproc ENDp end start

Анализ:

В этом примере я демонстрирую другую технику работы с тредами.

.IF uMsg==WM_CREATE invoke CreateEvent,NULL,FALSE,FALSE,NULL mov hEventStart,eax

mov eax,OFFSET Threadproc invoke CreateThread,NULL,NULL,eax,\ NULL,0,\ ADDR ThreadID

invoke CloseHandle,eax

Вы можете видеть, что я создал объект события и тред во время обработки сообщения WM_CREATE. Я создаю объект события, установленного в состояние "выключено" и обладающего свойством автоматического выключения. После того, как объект события создан, я создаю тред. Тем не менее, тред не начинает выполняться немедленно, так как он ждет, пока не включится объект события:

Threadproc pROC USES ecx param:DWORD

invoke WaitForSingleObject,hEventStart,INFINITE mov ecx,600000000

Первая линия процедуры треда - это вызов WainForSingleObject. Она ждет, пока не включится объект события, а затем возвращается. Это означает, что даже если тред создан, мы помещаем его в спящее состояние.

Когда пользователь выбирает в меню команду "run thread", мы включаем объект события:

.if ax==IDM_START_THREAD invoke SetEvent,hEventStart

Вызов SetEvent включает объект события, после чего WainForSingleObject возвращается и тред начинает выполняться. Когда пользователь выбирает команду "stoр thread", мы устанавливаем значение глобальной переменной в TRUE.

.if EventStop==FALSE add eax,eax dec ecx .else invoke MessageBox,hwnd,ADDR StopString,ADDR AppName,MB_OK mov EventStop,FALSE jmp Threadproc .endif

Это останавливает тред и снова передает управление функции WaitForSingleObject. Заметьте, что мы не должны вручную выключать объект, так как мы указали при вызове функции CreateEvent, что значение bManualReset pавно FALSE.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед