dec ecx
.else
invoke messagebox,hwnd,addr stopstring,addr appname,mb_ok
mov eventstop,false
jmp threadproc
.endif
.endw
invoke postmessage,hwnd,wm_finish,null,null
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 消息的处理中我们生成事件同步对象并创建线程。我们设置了相关的值让同步对象生成时处于”无信号”状态而且在调用了waitforsingleobject后可以自动把事件对象的状态设为”无信号”。然后我们创建线程。 线程的代码开始执行后立即被阻塞:
threadproc proc uses ecx param:dword
invoke waitforsingleobject,heventstart,infinite
mov ecx,600000000
您可以看到线程的执行体的第一条代码就是调用waitforsingleobject函数,该函数使得线程阻塞并且一直处于等待事件对象变成”有信号”。这也就是说,我们以开始就让该线程进入了睡眠状态。 当用户选择了菜单项”run thread”后,我们把事件对象得状态变成”有信号”:
.if ax==idm_start_thread
invoke setevent,heventstart
函数setevent可以让同步对象变成”有信号”状态,那么下一次线程得到时间片运行时,waitforsingleobject函数就会返回,线程余下的代码就可以得到执行了。当用户选择了菜单项”stop thread” 时,我们把全局变量eventstop设为true。
.if eventstop==false
add eax,eax
dec ecx
.else
invoke messagebox,hwnd,addr stopstring,addr appname,mb_ok
mov eventstop,false
jmp threadproc