鱼C论坛

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

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

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

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

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

x
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ;event.asm
  3. ;使用时间对象来做为多线程之间的“信号灯”
  4. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  5. ;使用nmake或下列命令进行编译和链接
  6. ; ml /c /coff event.asm
  7. ; rc event.rc
  8. ; Link /subsystem:windows event.obj event.res
  9. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10.         .386
  11.         .model        flat,stdcall
  12.         option        casemap:none
  13. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  14. ; Include 文件定义
  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16. include                windows.inc
  17. include                user32.inc
  18. includelib        user32.lib
  19. include                kernel32.inc
  20. includelib        kernel32.lib
  21. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  22. ;Equ 等值定义
  23. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  24. ICO_MAIN                equ        1000
  25. DLG_MAIN                equ        1000
  26. IDC_COUNTER        equ        1001
  27. IDC_PAUSE        equ        1002
  28. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  29. ;数据段
  30. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  31.         .data?
  32.        
  33.         hInstance        dd        ?
  34.         hWinMain                dd        ?
  35.         hWinCount        dd        ?
  36.         hWinPause        dd        ?
  37.         hEvent                dd        ?
  38.        
  39.         dwOption                dd        ?
  40.         F_PAUSE                equ        0001h
  41.         F_STOP                equ        0002h
  42.         F_COUNTING        equ        0004h
  43.        
  44.         .const
  45.        
  46.         szStop        db        '停止计数',0
  47.         szStart        db '计数',0
  48. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  49. ;代码段
  50. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  51.         .code
  52. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  53. _Counter                proc                uses ebx esi edi,_lParam
  54.                                 or                dwOption,F_COUNTING
  55.                                 and        dwOption,not (F_STOP or F_PAUSE)
  56.                                 invoke        SetEvent,hEvent
  57.                                 invoke        SetWindowText,hWinCount,addr szStop
  58.                                 invoke        EnableWindow,hWinPause,TRUE
  59.                                
  60.                                 xor        ebx,ebx
  61.                                 .while        !(dwOption & F_STOP)
  62.                                                 inc        ebx
  63.                                                 invoke        SetDlgItemInt,hWinMain,IDC_COUNTER,ebx,FALSE
  64.                                                 invoke        WaitForSingleObject,hEvent,INFINITE
  65.                                 .endw
  66.                                
  67.                                 invoke        SetWindowText,hWinCount,addr szStart
  68.                                 invoke        EnableWindow,hWinPause,FALSE
  69.                                 and        dwOption,not (F_COUNTING or F_STOP or F_PAUSE)
  70.                                 ret
  71. _Counter                endp

  72.                
  73. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  74. _ProcDlgMain        proc        uses        ebx edi esi hWnd,wMsg,wParam,lParam
  75.                                         LOCAL        @dwThreadID
  76.                                        
  77.                                         mov        eax,wMsg
  78.                                         .if                eax == WM_COMMAND
  79.                                                 mov        eax,wParam
  80.                                                 .if        ax == IDOK
  81.                                                         .if        dwOption & F_COUNTING
  82.                                                                 invoke        SetEvent,hEvent
  83.                                                                 or                dwOption,F_STOP
  84.                                                         .else
  85.                                                                 invoke        CreateThread,NULL,0,offset _Counter,NULL,\
  86.                                                                         NULL,addr @dwThreadID
  87.                                                                 invoke        CloseHandle,eax
  88.                                                         .endif
  89.                                                 .elseif ax == IDC_PAUSE
  90.                                                         xor dwOption,F_PAUSE
  91.                                                         .if dwOption & F_PAUSE
  92.                                                                 invoke        ResetEvent,hEvent
  93.                                                         .else
  94.                                                                 invoke        SetEvent,hEvent
  95.                                                         .endif
  96.                                                 .endif
  97.                                         .elseif        eax == WM_CLOSE
  98.                                                 invoke        CloseHandle,hEvent
  99.                                                 invoke        EndDialog,hWnd,NULL
  100.                                         .elseif        eax == WM_INITDIALOG
  101.                                                 push        hWnd
  102.                                                 pop        hWinMain
  103.                                                 invoke        GetDlgItem,hWnd,IDOK
  104.                                                 mov        hWinCount,eax
  105.                                                 invoke        GetDlgItem,hWnd,IDC_PAUSE
  106.                                                 mov        hWinPause,eax
  107.                                                 invoke        CreateEvent,NULL,TRUE,FALSE,NULL
  108.                                                 mov        hEvent,eax
  109.                                         .else
  110.                                                 mov        eax,FALSE
  111.                                                 ret
  112.                                         .endif
  113.                                         mov        eax,TRUE
  114.                                        
  115.        
  116.        
  117.         ret

  118. _ProcDlgMain endp
  119. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  120. john:
  121.                         invoke        GetModuleHandle,NULL
  122.                         mov        hInstance,eax
  123.                         invoke        DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
  124.                         invoke        ExitProcess,NULL
  125.                        
  126.                         end john
  127. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
































复制代码
小甲鱼最新课程 -> https://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

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

本版积分规则

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

GMT+8, 2025-7-13 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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