⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 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 + -