📄 thread.asm
字号:
include head.inc
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDD_DIALOG equ 101
IDC_RESUME equ 1000
IDC_CREATE equ 1001
IDC_SUSPEND equ 1002
IDC_NUM equ 1003
IDC_COUNT equ 1004
WM_THREADDATA equ WM_USER+1
WM_THREADEND equ WM_USER+2
.data
TitleName db "线程",0
ThreadError db "线程建立错误!",0
ThreadEnd db "线程运行结束",0
.data?
hThreadPass HANDLE ?
hThread HANDLE ?
hWndResume HANDLE ?
hSuspend HANDLE ?
hCreate HANDLE ?
Counter dd ?
number dd ?
ThreadID dd ?
.code
start:
invoke DialogBoxParam,NULL,IDD_DIALOG,NULL,addr ModalDlgProc,NULL
invoke ExitProcess,eax
ModalDlgProc proc uses edi hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
.if uMsg==WM_INITDIALOG
mov Counter,0
mov number,0
push hWnd
pop hThreadPass
invoke GetDlgItem,hWnd,IDC_RESUME
mov hWndResume,eax
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWnd,IDC_SUSPEND
mov hSuspend,eax
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWnd,IDC_CREATE
mov hCreate,eax
.elseif uMsg==WM_COMMAND
.if lParam
mov eax,wParam
.if ax==IDC_CREATE
mov eax,offset ThreadProc
invoke CreateThread,NULL,NULL,eax,addr hThreadPass,0,addr ThreadID
mov hThread,eax
.if !eax
invoke MessageBox,NULL,addr ThreadError,addr TitleName,MB_OK
.endif
invoke EnableWindow,hCreate,FALSE
invoke EnableWindow,hSuspend,TRUE
.elseif ax==IDC_SUSPEND
inc number
invoke SuspendThread,hThread
invoke SetDlgItemInt,hWnd,IDC_NUM,number,FALSE
invoke EnableWindow,hWndResume,TRUE
.elseif ax==IDC_RESUME
invoke ResumeThread,hThread
dec number
invoke SetDlgItemInt,hWnd,IDC_NUM,number,FALSE
.if !number
invoke EnableWindow,hWndResume,FALSE
.endif
.endif
.endif
.elseif uMsg==WM_MOUSEMOVE
mov Counter,0
.elseif uMsg==WM_THREADDATA
invoke SetDlgItemInt,hWnd,IDC_COUNT,wParam,FALSE
.elseif uMsg==WM_THREADEND
invoke MessageBox,hWnd,addr ThreadEnd,addr TitleName,MB_OK
invoke EnableWindow,hCreate,TRUE
invoke EnableWindow,hSuspend,FALSE
.elseif uMsg==WM_CLOSE
invoke CloseHandle,hThread
invoke EndDialog,hWnd,FALSE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
ModalDlgProc endp
ThreadProc proc uses edi param:dword
mov edi,param
mov ecx,0fffffh
again:
inc Counter
push ecx
invoke PostMessage ,[edi],WM_THREADDATA,Counter,0
pop ecx
loop again
invoke SendMessage ,[edi],WM_THREADEND,0,0
ret
ThreadProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -