Уроки Iczelion'а


         

eax dec ecx jz Get_out


xor eax,eax ret Wndproc endp
Threadproc pROC USES ecx param:DWORD mov ecx,600000000 Loop1:
add eax, eax dec ecx jz Get_out jmp Loop1
Get_out: invoke postMessage,hwnd,WM_FINISH,NULL,NULL ret
Threadproc ENDp
end start
Анализ:
Основную программу пользователь воспринимает как обычное окно с меню. Если пользователь выбирает в последнем пункт "Создать тред", программа создает тред:
.if ax==IDM_CREATE_THREAD mov eax,OFFSET Threadproc invoke CreateThread,NULL,NULL,eax,\ NULL,0,\
ADDR ThreadID invoke CloseHandle,eax
Вышеприведенная функция создает тред, который запустит процедуру под названием Threadрroc параллельно с основным тредом. Если вызов функции прошел успешно, CreateThread немедленно возвращается и Threadproc начинает выполняться. Так как мы не используем хэндл треда, нам следует закрыть его, чтобы не допустить бессмысленное расходование памяти. Закрытие хэндла не прерывает сам тред. Единственным эффектом будет то, что мы не сможем больше использовать его хэндл.
Threadproc pROC USES ecx param:DWORD
mov ecx,600000000 Loop1: add eax,eax dec ecx
jz Get_out jmp Loop1 Get_out: invoke postMessage,hwnd,WM_FINISH,NULL,NULL
ret Threadproc ENDp
Как вы можете видеть Threadрroc выполняет подсчет, требующий некоторого времени, и когда она заканчивает его, она отправляет сообщение WM_FINISH основному окну. WM_FINISH - это наше собственное сообщение, определенное следующим образом:
WM_FINISH equ WM_USER+100h
Вам не обязательно добавлять к WM_USER 100h, но будет лучше сделать это. Сообщение WM_FINISH имеет значение только в пределах нашей программы. Когда основное окно получает WM_FINISH, она реагирует на это показом окна с сообщением о том, что подсчет закончен.
Вы можете создать несколько тредов, выбрав "Create Thread" несколько раз. В этом примере применяется односторонняя коммуникация, то есть только тред может уведомлять основное окно о чем-либо. Если вы хотите, что основной тред слал команды рабочему, вы должны сделать следующее:

  • добавить пункт меню "Kill Thread".

  • добавить глобальную переменную, используемую в качестве флага. TRUE = остановить тред, FALSE = продолжить тред.

  • Изменить Threadрroc так, чтобы та проверяла в цикле значение флага.

Когда пользователь выберет "Kill Thread", основная программа установит флаг в TRUE. Когда Threadproc видит, что значение флага равно TRUE, она выходит из цикла и возвращается, что заканчивает действие треда.
[C] Iczelion, пер. Aquila.

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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий