亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 016.txt

?? 會變語言實現的一些程序
?? TXT
字號:
第十六課 事件對象


--------------------------------------------------------------------------------
本課中我們將要學習事件對象以及如何在多線程編程中如何使用同步對象。 
理論:
上一課中我們演示了如何用WINDOWS消息在不同的線程之間進行通訊。另外的兩種,即:使用全局變量和事件對象,將在本課中講解。 
事件對象就像一個開關:它只有兩種狀態---開和關。當一個事件處于”開”狀態,我們稱其為”有信號”否則稱為”無信號”。您可以在一個線程的執行函數中創建一個事件對象,然后觀察它的狀態,如果是”無信號”就讓該線程睡眠,這樣該線程占用的CPU時間就比較少。 
產生事件對象的函數如下: 
CreateEvent proto lpEventAttributes:DWORD,\ 
                              bManualReset:DWORD,\ 
                              bInitialState:DWORD,\ 
                              lpName:DWORD 

lpEventAttribute--> 如果是NULL值,產生的事件對象有缺省的安全屬性。
bManualReset--> 如果想在每次調用WaitForSingleObject 后讓WINDOWS為您自動地把事件地狀態恢復為”無信號”狀態,必須把該參數設為FALSE,否則,您必須每次調用ResetEvent函數來清除事件的信號。
bInitialState--> 剛剛產生事件對象時的狀態。如果設為TRUE是”有信號”,否則是”無信號”。
lpName --> 事件對象的名稱。您在OpenEvent函數中可能使用。 

如果CreateEvent調用成功的話,會返回新生成的對象的句柄,否則返回NULL。
這里有兩個API函數用來修改事件對象的信號狀態:SetEvent和ResetEvent。前者把事件對象設為”有信號”狀態,而后者正好相反。
在事件對象生成后,必須調用WaitForSingleObject來讓線程進入等待狀態,該函數的語法如下: 

WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD 

hObject -->指向同步對象的指針。事件對象其實是同步對象的一種。
dwTimeout --> 等待同步對象變成”有信號”前等待的時間,以毫秒計。當等待的時間超過該值后無信號同步對象仍處于”無信號”狀態,線程不再等待,WaitForSingleObject函數會返回。如果想要線程一直等待,請把該參數設為INFINITE(該值等于0xffffffff)。 

例子:
下面的例子顯示了一個窗口,當用戶選擇了菜單項”run thread”后,線程開始簡單的計數運算。結束后彈出一個對話框通知用戶。在整個的計數期間,您可以選擇菜單項”stop thread”來隨時終止線程。 
.386 
.model flat,stdcall 
option casemap:none 
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 

.const 
IDM_START_THREAD equ 1 
IDM_STOP_THREAD equ 2 
IDM_EXIT equ 3 
WM_FINISH equ WM_USER+100h 

.data 
ClassName db "Win32ASMEventClass",0 
AppName  db "Win32 ASM Event Example",0 
MenuName db "FirstMenu",0 
SuccessString db "The calculation is completed!",0 
StopString db "The thread is stopped",0 
EventStop BOOL FALSE 

.data? 
hInstance HINSTANCE ? 
CommandLine LPSTR ? 
hwnd HANDLE ? 
hMenu HANDLE ? 
ThreadID DWORD ? 
ExitCode DWORD ? 
hEventStart HANDLE ? 

.code 
start: 
    invoke GetModuleHandle, NULL 
    mov    hInstance,eax 
    invoke GetCommandLine 
    mov CommandLine,eax 
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT 
    invoke ExitProcess,eax 

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
    LOCAL wc:WNDCLASSEX 
    LOCAL msg:MSG 
    mov   wc.cbSize,SIZEOF WNDCLASSEX 
    mov   wc.style, CS_HREDRAW or CS_VREDRAW 
    mov   wc.lpfnWndProc, OFFSET WndProc 
    mov   wc.cbClsExtra,NULL 
    mov   wc.cbWndExtra,NULL 
    push  hInst 
    pop   wc.hInstance 
    mov   wc.hbrBackground,COLOR_WINDOW+1 
    mov   wc.lpszMenuName,OFFSET MenuName 
    mov   wc.lpszClassName,OFFSET ClassName 
    invoke LoadIcon,NULL,IDI_APPLICATION 
    mov   wc.hIcon,eax 
    mov   wc.hIconSm,eax 
    invoke LoadCursor,NULL,IDC_ARROW 
    mov   wc.hCursor,eax 
    invoke RegisterClassEx, addr wc 
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,\ 
            ADDR  AppName,\ 
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ 
           CW_USEDEFAULT,300,200,NULL,NULL,\ 
           hInst,NULL 
    mov   hwnd,eax 
    invoke ShowWindow, hwnd,SW_SHOWNORMAL 
    invoke UpdateWindow, hwnd 
    invoke GetMenu,hwnd 
    mov  hMenu,eax 
    .WHILE TRUE 
            invoke GetMessage, ADDR msg,NULL,0,0 
            .BREAK .IF (!eax) 
            invoke TranslateMessage, ADDR msg 
            invoke DispatchMessage, ADDR msg 
    .ENDW 
    mov     eax,msg.wParam 
    ret 
WinMain endp 

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    .IF uMsg==WM_CREATE 
        invoke CreateEvent,NULL,FALSE,FALSE,NULL 
        mov  hEventStart,eax 
        mov  eax,OFFSET ThreadProc 
        invoke CreateThread,NULL,NULL,eax,\ 
                             NULL,0,\ 
                             ADDR ThreadID 
        invoke CloseHandle,eax 
    .ELSEIF uMsg==WM_DESTROY 
        invoke PostQuitMessage,NULL 
    .ELSEIF uMsg==WM_COMMAND 
        mov eax,wParam 
        .if lParam==0 
            .if ax==IDM_START_THREAD 
                invoke SetEvent,hEventStart 
                invoke EnableMenuItem,hMenu,IDM_START_THREAD,MF_GRAYED 
                invoke EnableMenuItem,hMenu,IDM_STOP_THREAD,MF_ENABLED 
            .elseif ax==IDM_STOP_THREAD 
                mov  EventStop,TRUE 
                invoke EnableMenuItem,hMenu,IDM_START_THREAD,MF_ENABLED 
                invoke EnableMenuItem,hMenu,IDM_STOP_THREAD,MF_GRAYED 
            .else 
                invoke DestroyWindow,hWnd 
            .endif 
        .endif 
    .ELSEIF uMsg==WM_FINISH 
        invoke MessageBox,NULL,ADDR SuccessString,ADDR AppName,MB_OK 
    .ELSE 
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam 
        ret 
.ENDIF 
    xor    eax,eax 
    ret 
WndProc endp 

ThreadProc PROC USES ecx Param:DWORD 
        invoke WaitForSingleObject,hEventStart,INFINITE 
        mov  ecx,600000000 
        .WHILE ecx!=0 
                .if EventStop!=TRUE 
                        add  eax,eax 
                        dec  ecx 
                .else 
                        invoke MessageBox,hwnd,ADDR StopString,ADDR AppName,MB_OK 
                        mov  EventStop,FALSE 
                        jmp ThreadProc 
                .endif 
        .ENDW 
        invoke PostMessage,hwnd,WM_FINISH,NULL,NULL 
        invoke EnableMenuItem,hMenu,IDM_START_THREAD,MF_ENABLED 
        invoke EnableMenuItem,hMenu,IDM_STOP_THREAD,MF_GRAYED 
        jmp   ThreadProc 
        ret 
ThreadProc ENDP 
end start 

分析:
本例中,我們演示另一種技巧: 
    .IF uMsg==WM_CREATE 
        invoke CreateEvent,NULL,FALSE,FALSE,NULL 
        mov  hEventStart,eax 
        mov  eax,OFFSET ThreadProc 
        invoke CreateThread,NULL,NULL,eax,\ 
                             NULL,0,\ 
                             ADDR ThreadID 
        invoke CloseHandle,eax 

在WM_CREATE 消息的處理中我們生成事件同步對象并創建線程。我們設置了相關的值讓同步對象生成時處于”無信號”狀態而且在調用了WaitForSingleObject后可以自動把事件對象的狀態設為”無信號”。然后我們創建線程。 線程的代碼開始執行后立即被阻塞: 

ThreadProc PROC USES ecx Param:DWORD 
        invoke WaitForSingleObject,hEventStart,INFINITE 
        mov  ecx,600000000 

您可以看到線程的執行體的第一條代碼就是調用WaitForSingleObject函數,該函數使得線程阻塞并且一直處于等待事件對象變成”有信號”。這也就是說,我們以開始就讓該線程進入了睡眠狀態。 當用戶選擇了菜單項”run thread”后,我們把事件對象得狀態變成”有信號”: 

            .if ax==IDM_START_THREAD 
                invoke SetEvent,hEventStart 

函數SetEvent可以讓同步對象變成”有信號”狀態,那么下一次線程得到時間片運行時,WaitForSingleObject函數就會返回,線程余下的代碼就可以得到執行了。當用戶選擇了菜單項”stop thread” 時,我們把全局變量EventStop設為TRUE。 

                .if EventStop==FALSE 
                        add  eax,eax 
                        dec  ecx 
                .else 
                        invoke MessageBox,hwnd,ADDR StopString,ADDR AppName,MB_OK 
                        mov  EventStop,FALSE 
                        jmp ThreadProc 
                .endif 

這樣線程得計數工作結束,然后跳轉到重新執行WaitForSingleObject函數的地方。注意:我們不用手動清除事件對象的信號,因為在調用CreateEvent函數時把參數bManualReset的值設為了FALSE。 


--------------------------------------------------------------------------------




--------------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91色综合久久免费分享| 国产馆精品极品| 亚洲欧洲一区二区三区| 欧美一级欧美一级在线播放| 色综合欧美在线| 成人污污视频在线观看| 久久99最新地址| 性欧美大战久久久久久久久| 亚洲精品美腿丝袜| 国产精品毛片高清在线完整版| 精品国产99国产精品| 91婷婷韩国欧美一区二区| 国产精品一品视频| 国产美女视频91| 美国十次了思思久久精品导航| 亚洲一级电影视频| 一区二区三区精品视频| 亚洲欧美另类久久久精品| 日本一区二区在线不卡| 欧美激情中文不卡| 欧美激情在线一区二区三区| 久久精品亚洲一区二区三区浴池| 欧美大片在线观看一区二区| 欧美一区二区三区影视| 欧美一区二区三区在线观看| 欧美日韩免费一区二区三区| 欧美三区在线视频| 欧美理论电影在线| 91精品国产91久久综合桃花| 日韩区在线观看| 欧美大片免费久久精品三p| 精品国产乱码久久久久久久久| 精品久久久久久久久久久院品网| 亚洲精品在线免费播放| 日韩影院在线观看| 天天色天天操综合| 免费看黄色91| 精品在线一区二区三区| 国产综合久久久久久鬼色 | 精品国产三级a在线观看| 精品国产一区二区亚洲人成毛片| 久久综合久久久久88| 国产精品人人做人人爽人人添| 国产精品日韩精品欧美在线| 亚洲男人的天堂一区二区 | 一区二区三区**美女毛片| 亚洲综合色成人| 亚洲成人精品在线观看| 日韩av成人高清| 国内精品伊人久久久久影院对白| 国产成人aaa| 一本大道久久a久久综合婷婷| 欧美日韩色一区| 精品国产一区二区三区不卡 | 日本最新不卡在线| 国产美女一区二区| 色综合久久久久网| 91精品国产91久久综合桃花| 精品黑人一区二区三区久久| 国产日产亚洲精品系列| 一区二区三区四区蜜桃| 日本免费新一区视频| 极品少妇一区二区| 成人不卡免费av| 欧美日韩精品欧美日韩精品| 精品久久久久一区二区国产| 亚洲色图丝袜美腿| 另类小说综合欧美亚洲| 国产精品18久久久久久久网站| 一本一本大道香蕉久在线精品| 欧美一区二区免费| 伊人色综合久久天天| 成人激情免费电影网址| 欧美一区二区视频免费观看| 亚洲综合无码一区二区| 成人激情电影免费在线观看| 欧美成人精品1314www| 亚洲成av人影院| 91免费版在线| 国产综合色精品一区二区三区| 欧美探花视频资源| 国产精品麻豆久久久| 国产黄人亚洲片| 精品免费日韩av| 蜜臀国产一区二区三区在线播放 | 欧美日韩在线三级| 中文字幕综合网| 成人丝袜高跟foot| 国产亚洲午夜高清国产拍精品 | 不卡的看片网站| 久久久精品一品道一区| 乱一区二区av| 91精品久久久久久久99蜜桃| 亚洲图片欧美综合| 欧美亚洲综合网| 亚洲蜜臀av乱码久久精品 | 3d动漫精品啪啪一区二区竹菊| 自拍偷拍亚洲欧美日韩| www.亚洲在线| 国产精品乱子久久久久| 成人av网站免费观看| 国产亚洲欧美在线| 岛国精品在线播放| 国产精品欧美极品| 99这里只有精品| 国产精品亚洲а∨天堂免在线| wwwwww.欧美系列| 国产一区二区在线视频| 久久久久久久久伊人| 国产精品自拍av| 亚洲国产成人午夜在线一区| 菠萝蜜视频在线观看一区| 一区视频在线播放| 在线观看日韩精品| 亚洲超碰精品一区二区| 日韩一区二区电影| 国内精品伊人久久久久av一坑| 欧美精品一区二区三| 国产99久久久国产精品潘金| 中文字幕一区二区三区视频| 色综合视频一区二区三区高清| 一区二区三区日韩| 69堂亚洲精品首页| 国模大尺度一区二区三区| 国产免费观看久久| 91精彩视频在线观看| 日韩成人午夜电影| 久久婷婷久久一区二区三区| 成人夜色视频网站在线观看| 亚洲欧美另类图片小说| 8x福利精品第一导航| 国产精品自在在线| 亚洲视频免费在线| 4438x成人网最大色成网站| 国内精品第一页| 一色桃子久久精品亚洲| 欧美日本韩国一区| 国产成人亚洲精品狼色在线| 亚洲人成在线观看一区二区| 91精品啪在线观看国产60岁| 日韩写真欧美这视频| 国产一区二区在线看| 亚洲欧美日韩电影| 日韩欧美国产麻豆| 99久久精品免费看| 日韩主播视频在线| 亚洲国产精品黑人久久久| 日本道免费精品一区二区三区| 日韩精品免费专区| 国产欧美综合色| 欧洲av在线精品| 国产一区二区三区视频在线播放| 亚洲色图清纯唯美| 日韩视频国产视频| 色综合久久中文字幕| 麻豆视频一区二区| 亚洲视频在线一区| 欧美xxxx在线观看| 色婷婷久久99综合精品jk白丝| 美国十次综合导航| 亚洲精品亚洲人成人网| 久久亚洲欧美国产精品乐播 | 国产日韩欧美精品综合| 欧美日韩成人一区二区| 成人免费视频一区二区| 日韩精品免费视频人成| 中文字幕在线观看不卡| 日韩三级在线观看| 色老汉一区二区三区| 国产成人亚洲综合a∨婷婷图片| 性做久久久久久| 综合电影一区二区三区| 精品999久久久| 欧美美女一区二区在线观看| 成人v精品蜜桃久久一区| 久久99精品久久久久| 91丨九色丨蝌蚪丨老版| 国产综合色产在线精品| 日韩黄色免费电影| 一区二区三区日韩| 18涩涩午夜精品.www| 国产婷婷色一区二区三区在线| 制服丝袜av成人在线看| 欧美性生活大片视频| 91视频xxxx| 成人黄色片在线观看| 国产精品69毛片高清亚洲| 久久国产精品72免费观看| 五月天国产精品| 亚洲一区视频在线| 亚洲欧美激情插| 综合在线观看色| **网站欧美大片在线观看| 国产三级欧美三级日产三级99 | 一区二区三区不卡在线观看 | 欧美极品美女视频| 国产亚洲一区二区在线观看| 精品久久久久久久久久久久包黑料 | 91麻豆国产福利精品| 粉嫩高潮美女一区二区三区|