critical.asm

来自「windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解」· 汇编 代码 · 共 87 行

ASM
87
字号
include head.inc
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDD_DIALOG                 equ  101
IDC_COUNT                  equ 1000
IDC_CREATE                 equ 1001
WM_THREADDATA       equ WM_USER+1
.data
TitleName      db "线程",0
.data?
hThreadPass    HANDLE  ?
hThreadInc      HANDLE  ?
hThreadDec      HANDLE  ?
Counter            dd           ?
ThreadID         dd          ?
CriticalSec        CRITICAL_SECTION  <>
.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
      push hWnd
      pop hThreadPass
      invoke InitializeCriticalSection,addr CriticalSec
      mov Counter,0
   .elseif  uMsg==WM_COMMAND
      .if  lParam
         mov eax,wParam
         .if  ax==IDC_CREATE
            mov eax,offset ThreadProcInc
            invoke CreateThread,NULL,NULL,eax,addr hThreadPass,0,addr ThreadID
            mov hThreadInc,eax
            mov eax,offset ThreadProcDec
            invoke CreateThread,NULL,NULL,eax,addr hThreadPass,0,addr ThreadID
            mov hThreadDec,eax
            invoke GetDlgItem,hWnd,IDC_CREATE
            invoke EnableWindow,eax,FALSE
         .endif
      .endif
   .elseif uMsg==WM_THREADDATA
      invoke SetDlgItemInt,hWnd,IDC_COUNT,wParam,FALSE
   .elseif uMsg==WM_CLOSE
      invoke DeleteCriticalSection ,addr CriticalSec
      invoke CloseHandle,hThreadInc
      invoke CloseHandle,hThreadDec
      invoke EndDialog,hWnd,FALSE
  .else
     mov eax,FALSE
     ret
  .endif
  mov eax,TRUE
  ret
ModalDlgProc endp

ThreadProcInc  proc uses edi param:dword
   invoke EnterCriticalSection,addr CriticalSec
   mov edi,param 
   mov ecx,0ffffh 
again:
   inc Counter
   push ecx
   invoke PostMessage ,[edi],WM_THREADDATA,Counter,0
   pop ecx
   loop again
   invoke LeaveCriticalSection,addr CriticalSec
   ret
ThreadProcInc endp

ThreadProcDec  proc uses edi param:dword
   invoke EnterCriticalSection,addr CriticalSec
   mov edi,param 
   mov ecx,0ffffh 
again:
   Dec Counter
   push ecx
   invoke PostMessage ,[edi],WM_THREADDATA,Counter,0
   pop ecx
   loop again
   invoke LeaveCriticalSection,addr CriticalSec
   ret
ThreadProcDec endp
end start


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?