• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我的玻璃盒子

            (轉(zhuǎn)帖)Windows同步API (二)—— Event

            原文鏈接:http://m.shnenglu.com/wangjt/archive/2008/02/01/42312.html

              Event即事件是一種用于進(jìn)行線程/進(jìn)程間同步的對(duì)象,事件有置位和復(fù)位兩種狀態(tài),當(dāng)線程通過(guò)waiting functions等待Event對(duì)象置位時(shí)該線程將進(jìn)入阻塞狀態(tài),當(dāng)該Event對(duì)象被置位或等待超時(shí)后,等待的線程將恢復(fù)執(zhí)行。Event可以用在一個(gè)線程要等待其它線程時(shí)。
            可以使用CreateEvent創(chuàng)建Event對(duì)象
            HANDLE WINAPI CreateEvent(
                LPSECURITY_ATTRIBUTES lpEventAttributes,
                BOOL bManualReset,
                BOOL bInitialState,
                LPCTSTR lpName
            );
            lpEventAttributes用于指定Event對(duì)象的安全屬性,包括句柄是否可被子進(jìn)程繼承和對(duì)象的安全描述符。可設(shè)置NULL取默認(rèn)安全屬性。
            bManualReset表明Event對(duì)象是否需要手動(dòng)復(fù)位。如果該參數(shù)為TRUE,則Event對(duì)象需要通過(guò)ResetEvent函數(shù)手動(dòng)復(fù)位。如果該參數(shù)為FALSE,則Event被創(chuàng)建為自動(dòng)復(fù)位的Event,任何等待的線程被恢復(fù)執(zhí)行后,該Event將被系統(tǒng)自動(dòng)復(fù)位。打個(gè)比方,如果有10個(gè)線程在等待一個(gè)Event,這時(shí)將Event置位,如果這是個(gè)手動(dòng)復(fù)位Event,那么這10個(gè)線程將被依次喚醒直到通過(guò)ResetEvent調(diào)用將該Event復(fù)位;如果Event為自動(dòng)復(fù)位Event,那么10個(gè)線程中的第一個(gè)被喚醒后Event被自動(dòng)復(fù)位,其它線程將繼續(xù)等待。
            bInitialState參數(shù)表明Event對(duì)象被創(chuàng)建后默認(rèn)是否置位。
            lpName參數(shù)是Event的名字,可以為空表明將創(chuàng)建匿名Event。
            CreateEvent函數(shù)在調(diào)用成功后返回Event句柄。如果同名Event已經(jīng)存在,則返回這個(gè)已經(jīng)存在了的Event的句柄,此時(shí)調(diào)用GetLastError函數(shù)將返回 ERROR_ALREADY_EXISTS。
            還可以通過(guò)OpenEvent打開(kāi)一個(gè)已經(jīng)創(chuàng)建的非匿名Event
            HANDLE WINAPI OpenEvent(
                DWORD dwDesiredAccess,
                BOOL bInheritHandle,
                LPCTSTR lpName
            );
            在創(chuàng)建或打開(kāi)了Event對(duì)象之后,可以使用SetEvent和ResetEvent函數(shù)來(lái)置位或復(fù)位一個(gè)Event對(duì)象。
            BOOL WINAPI SetEvent(
                HANDLE hEvent
            );
            BOOL WINAPI ResetEvent(
                HANDLE hEvent
            );
            要等待一個(gè)或多個(gè)Event對(duì)象置位可以使用wait functions。
            簡(jiǎn)單示例,一個(gè)線程不停讀取用戶輸入并放入message列表,另一個(gè)線程模擬將message發(fā)送出去,如果沒(méi)有消息,則發(fā)送線程處于阻塞狀態(tài)等待,一旦有消息錄入,輸入線程將event置位,發(fā)送線程即被激活并逐個(gè)發(fā)送消息。
            #include "stdafx.h"
            #include <windows.h>
            #include <tchar.h>
            #include <iostream>
            #include <list>
            #include <string>
            using namespace std;

            #ifdef _UNICODE
            typedef wstring tstring;
            #define tcout wcout
            #define tcin wcin
            #else
            typedef string tstring;
            #define tcout cout
            #define tcin cin
            #endif /* _UNICODE */

            typedef list<tstring> StringList;

            HANDLE hMutex = NULL;
            HANDLE hEvent = NULL;
            HANDLE hSendThread = NULL;
            StringList messages;

            bool isRunning;

            DWORD WINAPI SendThreadProc(LPVOID lpThreadParameter)
            {
            DWORD dw;
            while(isRunning)
            {
              dw = WaitForSingleObject(hEvent, INFINITE);
              if(dw != WAIT_OBJECT_0)
              {
               tcout << _T("Wait error.") << endl;
               return -1;
              }
              dw = WaitForSingleObject(hMutex, INFINITE);
              if(WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw)
              {
               tcout << _T("Wait error.") << endl;
               return -2;
              }

              StringList list(messages);
              messages.clear();

              ReleaseMutex(hMutex);

              for(StringList::iterator i = list.begin(); i != list.end(); i++)
              {
               Sleep(1000); //休眠1秒模擬發(fā)送所耗時(shí)間

               tcout << _T("/* Send Message:") << *i << _T(" */");
              }

            }

            return 0;
            }

            int _tmain(int argc, _TCHAR* argv[])
            {
            hMutex = CreateMutex(NULL, FALSE, NULL);
            hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
            isRunning = true;

            hSendThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendThreadProc, NULL, 0, NULL);

            while(isRunning)
            {
              tstring s;
              tcin >> s;
              if(s == _T("quit"))
              {
               isRunning = true;
               break;
              }

              DWORD dw = WaitForSingleObject(hMutex, INFINITE);
              if(WAIT_OBJECT_0 != dw && WAIT_ABANDONED != dw)
              {
               tcout << _T("Wait error.") << endl;
               return -1;
              }
              messages.push_back(s);
              ReleaseMutex(hMutex);
              SetEvent(hEvent);
            }

            CloseHandle(hMutex);
            CloseHandle(hEvent);
            CloseHandle(hSendThread);

            return 0;

            }

            posted on 2008-02-03 10:44 深藍(lán)色系統(tǒng) 閱讀(570) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows開(kāi)發(fā)

            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲欧美日韩中文久久 | 日韩人妻无码一区二区三区久久| 久久国产一片免费观看| 国产精品欧美久久久久天天影视| 久久免费国产精品| 久久99国产综合精品免费| aaa级精品久久久国产片| 亚洲欧洲精品成人久久曰影片| 一本色道久久99一综合| 亚洲AⅤ优女AV综合久久久| 久久精品成人免费网站| 亚洲精品无码成人片久久| 久久er国产精品免费观看2| 亚洲国产成人久久精品99| 99久久免费国产精精品| 看全色黄大色大片免费久久久| 久久精品中文字幕无码绿巨人 | 久久男人中文字幕资源站| 午夜精品久久久久久久久| 欧美久久天天综合香蕉伊| 94久久国产乱子伦精品免费| 久久99精品久久久久久动态图| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 精品国产99久久久久久麻豆| 99精品伊人久久久大香线蕉| 亚洲午夜久久久久妓女影院 | 国产精品久久久久久久| 亚洲欧洲日产国码无码久久99| 久久久久黑人强伦姧人妻| 久久国产精品无码网站| 国产精品青草久久久久福利99| 精品久久久噜噜噜久久久 | 亚洲国产精品人久久| 国产精品久久久天天影视| 99久久国产热无码精品免费| 一本色道久久综合狠狠躁| 亚洲AV乱码久久精品蜜桃| 久久精品亚洲精品国产色婷 | 噜噜噜色噜噜噜久久| 久久精品综合网| 亚洲精品高清国产一线久久|