📄 tut15.html
字号:
.IF uMsg==WM_DESTROY</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
invoke PostQuitMessage,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.ELSEIF uMsg==WM_COMMAND</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
mov eax,wParam</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.if lParam==0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
.if ax==IDM_CREATE_THREAD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
mov eax,OFFSET ThreadProc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
invoke CreateThread,NULL,NULL,eax,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
0,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
ADDR ThreadID</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
invoke CloseHandle,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.else</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
invoke DestroyWindow,hWnd</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
.ELSEIF uMsg==WM_FINISH</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
invoke MessageBox,NULL,ADDR SuccessString,ADDR AppName,MB_OK</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.ELSE</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
invoke DefWindowProc,hWnd,uMsg,wParam,lParam</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
.ENDIF</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
xor eax,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>WndProc
endp</font></font></font></b><font face="Arial,Helvetica"><font size=-1></font></font>
<p><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>ThreadProc
PROC USES ecx Param:DWORD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
mov ecx,600000000</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>Loop1:</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
add eax,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
dec ecx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
jz Get_out</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
jmp Loop1</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>Get_out:</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
invoke PostMessage,hwnd,WM_FINISH,NULL,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#66FF99"><font size=-1>ThreadProc
ENDP</font></font></font></b><font face="Arial,Helvetica"><font size=-1></font></font>
<p><b><font face="Arial,Helvetica"><font color="#FFFFCC"><font size=-1>end
start</font></font></font></b>
<br><font face="Arial,Helvetica"><font size=-1></font></font>
<h3>
<font face="Arial,Helvetica"><font color="#33FF33"><font size=+0>Analysis:</font></font></font></h3>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>The main
program presents the user with a normal window with a menu. If the user
selects "Create Thread" menu item, the program creates a thread as below:</font></font></font><font face="Arial,Helvetica"><font size=-1></font></font>
<p><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
.if ax==IDM_CREATE_THREAD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
mov eax,OFFSET ThreadProc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
invoke CreateThread,NULL,NULL,eax,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
NULL,0,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
ADDR ThreadID</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
invoke CloseHandle,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1> </font></font></font></b>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>The
above function creates a thread that will run a procedure named ThreadProc
concurrently with the primary thread. After the successful call, CreateThread
returns immediately and ThreadProc begins to run. Since we do not use thread
handle, we should close it else there'll be some leakage of memory. Note
that closing the thread handle doesn't terminate the thread. Its only effect
is that we cannot use the thread handle anymore.</font></font></font><font face="Arial,Helvetica"><font size=-1></font></font>
<p><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>ThreadProc
PROC USES ecx Param:DWORD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
mov ecx,600000000</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>Loop1:</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
add eax,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
dec ecx</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
jz Get_out</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
jmp Loop1</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>Get_out:</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
invoke PostMessage,hwnd,WM_FINISH,NULL,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>ThreadProc
ENDP</font></font></font></b><font face="Arial,Helvetica"><font size=-1></font></font>
<p><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>As
you can see, ThreadProc performs a savage calculation which takes quite
a while to finish and when it finishs it posts a WM_FINISH message to the
main window. WM_FINISH is our custom message defined like this:</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFF99"><font size=-1>WM_FINISH
equ WM_USER+100h</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>You don't
have to add WM_USER with 100h but it's safer to do so.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>The
WM_FINISH message is meaningful only within our program. When the main
window receives the WM_FINISH message, it respons by displaying a message
box saying that the calculation is completed.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>You
can create several threads in succession by selecting "Create Thread" several
times.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>In
this example, the communication is one-way in that only the thread can
notify the main window. If you want the main thread to send commands to
the worker thread, you can so as follows:</font></font></font>
<ul>
<li>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>add a
menu item saying something like "Kill Thread" in the menu</font></font></font></li>
<li>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>a global
variable which is used as a command flag. TRUE=Stop the thread, FALSE=continue
the thread</font></font></font></li>
<li>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>Modify
ThreadProc to check the value of the command flag in the loop.</font></font></font></li>
</ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>When the
user selects "Kill Thread" menu item, the main program will set the value
TRUE in the command flag. When ThreadProc sees that the value of the command
flag is TRUE, it exits the loop and returns thus ends the thread.</font></font></font>
<br>
<hr WIDTH="100%">
<center><b><font face="Arial,Helvetica"><font color="#006600"><font size=-1>[<a href="http://win32asm.cjb.net">Iczelion's
Win32 Assembly HomePage</a>]</font></font></font></b></center>
<font face="Arial,Helvetica"><font size=-1></font></font>
<p><br><font face="Arial,Helvetica"><font size=-1></font></font>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -