invoke closehandle,eax
.else
invoke destroywindow,hwnd
.endif
.endif
.elseif umsg==wm_finish
invoke messagebox,null,addr successstring,addr appname,mb_ok
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
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
分析:
主程序的主线程是一个用户界面线程,它有一个普通窗口。用户选择菜单项"create thread",程序就会产生一个线程:
.if ax==idm_create_thread
mov eax,offset threadproc
invoke createthread,null,null,eax,\
null,0,\
addr threadid
invoke closehandle,eax
上面的代码段产生一个线程,线程的主体代码是函数threadproc,该函数和主线程并行运行。在调用成功后,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
我们看到上面的线程的代码仅仅是做简单的计数工作,因为我们设了一个很大的基数,所以该线程会持续一段您能感觉得到的时间,当结束后它会向主线程发送wm_finish消息。wm_finish消息是我们自己定义的,它的定义如下:
- wm_finish equ wm_user+100h
wm_user消息是我们能够使用的最小消息值。
显然我们一看到wm_finish,就能从字面上理解该消息的意义。主线程接收到该消息后,会弹出一个对话框告诉用户,计算线程已经结束了。
通过线程之间的通讯,用户可以多次选择"create thread",那样就可以运行多个计算线程了。