离丶dong子 发表于 2012-11-10 16:06:29

win32第12章多线程的例题,求大神点一下,有些费解。

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;event.asm
;使用时间对象来做为多线程之间的“信号灯”
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;使用nmake或下列命令进行编译和链接
; ml /c /coff event.asm
; rc event.rc
; Link /subsystem:windows event.obj event.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model        flat,stdcall
        option        casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN                equ        1000
DLG_MAIN                equ        1000
IDC_COUNTER        equ        1001
IDC_PAUSE        equ        1002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
       
        hInstance        dd        ?
        hWinMain                dd        ?
        hWinCount        dd        ?
        hWinPause        dd        ?
        hEvent                dd        ?
       
        dwOption                dd        ?
        F_PAUSE                equ        0001h
        F_STOP                equ        0002h
        F_COUNTING        equ        0004h
       
        .const
       
        szStop        db        '停止计数',0
        szStart        db '计数',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Counter                proc                uses ebx esi edi,_lParam
                                or                dwOption,F_COUNTING
                                and        dwOption,not (F_STOP or F_PAUSE)
                                invoke        SetEvent,hEvent
                                invoke        SetWindowText,hWinCount,addr szStop
                                invoke        EnableWindow,hWinPause,TRUE
                               
                                xor        ebx,ebx
                                .while        !(dwOption & F_STOP)
                                                inc        ebx
                                                invoke        SetDlgItemInt,hWinMain,IDC_COUNTER,ebx,FALSE
                                                invoke        WaitForSingleObject,hEvent,INFINITE
                                .endw
                               
                                invoke        SetWindowText,hWinCount,addr szStart
                                invoke        EnableWindow,hWinPause,FALSE
                                and        dwOption,not (F_COUNTING or F_STOP or F_PAUSE)
                                ret
_Counter                endp

               
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain        proc        uses        ebx edi esi hWnd,wMsg,wParam,lParam
                                        LOCAL        @dwThreadID
                                       
                                        mov        eax,wMsg
                                        .if                eax == WM_COMMAND
                                                mov        eax,wParam
                                                .if        ax == IDOK
                                                        .if        dwOption & F_COUNTING
                                                                invoke        SetEvent,hEvent
                                                                or                dwOption,F_STOP
                                                        .else
                                                                invoke        CreateThread,NULL,0,offset _Counter,NULL,\
                                                                        NULL,addr @dwThreadID
                                                                invoke        CloseHandle,eax
                                                        .endif
                                                .elseif ax == IDC_PAUSE
                                                        xor dwOption,F_PAUSE
                                                        .if dwOption & F_PAUSE
                                                                invoke        ResetEvent,hEvent
                                                        .else
                                                                invoke        SetEvent,hEvent
                                                        .endif
                                                .endif
                                        .elseif        eax == WM_CLOSE
                                                invoke        CloseHandle,hEvent
                                                invoke        EndDialog,hWnd,NULL
                                        .elseif        eax == WM_INITDIALOG
                                                push        hWnd
                                                pop        hWinMain
                                                invoke        GetDlgItem,hWnd,IDOK
                                                mov        hWinCount,eax
                                                invoke        GetDlgItem,hWnd,IDC_PAUSE
                                                mov        hWinPause,eax
                                                invoke        CreateEvent,NULL,TRUE,FALSE,NULL
                                                mov        hEvent,eax
                                        .else
                                                mov        eax,FALSE
                                                ret
                                        .endif
                                        mov        eax,TRUE
                                       
       
       
        ret

_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
john:
                        invoke        GetModuleHandle,NULL
                        mov        hInstance,eax
                        invoke        DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                        invoke        ExitProcess,NULL
                       
                        end john
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
































离丶dong子 发表于 2012-11-10 16:09:28

空格加的太多了好像.
简单说:
                                                        .if        dwOption & F_COUNTING
                                                                invoke        SetEvent,hEvent
                                                                or                dwOption,F_STOP
                                                        .else
                                                                invoke        CreateThread,NULL,0,offset _Counter,NULL,\
                                                                        NULL,addr @dwThreadID
                                                                invoke        CloseHandle,eax
                                                        .endif

作者在创建线程之后紧着这有一个关闭线程的函数,在运行过程中线程并没有关闭,不懂他的用意。求四个明白,不然睡不下,吃不下,死不足惜
页: [1]
查看完整版本: win32第12章多线程的例题,求大神点一下,有些费解。