鱼C论坛

 找回密码
 立即注册
查看: 1907|回复: 1

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

[复制链接]
发表于 2012-11-10 16:06:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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

作者在创建线程之后紧着这有一个关闭线程的函数,在运行过程中线程并没有关闭,不懂他的用意。求四个明白,不然睡不下,吃不下,死不足惜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 10:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表