日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

CreateEvent的使用方法

系統(tǒng) 2510 0

? CreateEvent的使用方法 收藏

新一篇:?PreCreateWindow的作用和用法 ?|? 舊一篇:?VC中_T()的作用

事件對(duì)象就像一個(gè)開關(guān):它僅僅有兩種狀態(tài)---開和關(guān)。當(dāng)一個(gè)事件處于”開”狀態(tài),我們稱其為”有信號(hào)”否則稱為”無信號(hào)”。能夠在一個(gè)線程的運(yùn)行函數(shù)中創(chuàng)建一個(gè)事件對(duì)象,然后觀察它的狀態(tài),假設(shè)是”無信號(hào)”就讓該線程睡眠,這樣該線程占用的CPU時(shí)間就比較少。

產(chǎn)生事件對(duì)象的函數(shù)例如以下:??

HANDLE? ???CreateEvent(

??????? LPSECURITY_ATTRIBUTES? ???lpEventAttributes,? ???//? ???SD? ?
? ?? ???BOOL? ???bManualReset,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //? ???reset? ???type? ?
? ?? ???BOOL? ???bInitialState,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??????? ? //? ???initial? ???state? ?
? ?? ???LPCTSTR? ???lpName???????????????????????????????????????????????????????//? ???object? ???name? ?
? ? );? ?
? ? 該函數(shù)創(chuàng)建一個(gè)Event同步對(duì)象,假設(shè)CreateEvent調(diào)用成功的話,會(huì)返回新生成的對(duì)象的句柄,否則返回NULL。

參數(shù)說明:
??? lpEventAttributes? ???一般為NULL???


??? bManualReset? ?? ?? ?? ?? ?創(chuàng)建的Event是自己主動(dòng)復(fù)位還是人工復(fù)位.假設(shè)true,人工復(fù)位,?? 一旦該Event被設(shè)置為有信號(hào),則它一直會(huì)等到ResetEvent()API被調(diào)用時(shí)才會(huì)恢復(fù) 為無信號(hào).? ???假設(shè)為false,Event被設(shè)置為有信號(hào),則當(dāng)有一個(gè)wait到它的Thread時(shí),??該Event就會(huì)自己主動(dòng)復(fù)位,變成無信號(hào).???假設(shè)想 在每次調(diào)用WaitForSingleObject 后讓W(xué)INDOWS為您自己主動(dòng)地把事件地狀態(tài)恢復(fù)為”無信號(hào)”狀態(tài),必須把該參數(shù)設(shè)為FALSE,否則,您必須每次調(diào)用ResetEvent函數(shù)來清除事件 的信號(hào)。


??? bInitialState? ?? ?? ?? ? 初始狀態(tài),true,有信號(hào),false無信號(hào)? ?
? ? lpName??????????????????事件對(duì)象的名稱。您在OpenEvent函數(shù)中可能使用。

凝視:
??? 一個(gè)Event被創(chuàng)建以后,能夠用OpenEvent()API來獲得它的Handle,用CloseHandle()??? 來關(guān)閉它,用SetEvent()或PulseEvent()來設(shè)置它使其有信號(hào),用ResetEvent()?????? 來使其無信號(hào),用WaitForSingleObject()或WaitForMultipleObjects()來等待其變?yōu)橛行盘?hào).? ?
? ?
? ? PulseEvent()是一個(gè)比較有意思的用法,正如這個(gè)API的名字,它使一個(gè)Event?對(duì)象的狀態(tài)發(fā)生一次脈沖變化,從無信號(hào)變成有信號(hào)再變成無信號(hào),而整個(gè)操作是原子的.? ?
? ? 對(duì)自己主動(dòng)復(fù)位的Event對(duì)象,它僅釋放第一個(gè)等到該事件的thread(假設(shè)有),而對(duì)于人工復(fù)位的Event對(duì)象,它釋放全部等待的thread.??
?

?
這里有兩個(gè)API函數(shù)用來改動(dòng)事件對(duì)象的信號(hào)狀態(tài):SetEvent和ResetEvent。前者把事件對(duì)象設(shè)為”有信號(hào)”狀態(tài),而后者正好相反。
在事件對(duì)象生成后,必須調(diào)用WaitForSingleObject來讓線程進(jìn)入等待狀態(tài),該函數(shù)的語(yǔ)法例如以下:??

WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD??

hObject -->指向同步對(duì)象的指針。事件對(duì)象事實(shí)上是同步對(duì)象的一種。
dwTimeout --> 等待同步對(duì)象變成”有信號(hào)”前等待的時(shí)間,以毫秒計(jì)。當(dāng)?shù)却臅r(shí)間超過該值后無信號(hào)同步對(duì)象仍處于”無信號(hào)”狀態(tài),線程不再等待, WaitForSingleObject函數(shù)會(huì)返回。假設(shè)想要線程一直等待,請(qǐng)把該參數(shù)設(shè)為INFINITE(該值等于0xffffffff)。??

發(fā)表于 @ 2008年04月18日 13:30:00 | 評(píng)論( 0 ) | 編輯

新一篇:?PreCreateWindow的作用和用法 ?|? 舊一篇:?VC中_T()的作用



? Visual C++中的多線程 收藏

新一篇:?特洛伊木馬(一) ?|? 舊一篇:?用戶接口與作業(yè)調(diào)度

以前,以前研究過了java中的多線程問題,特別是加鎖和同步問題,可是,在C++中,確沒有這么簡(jiǎn)單了。因?yàn)镃沒有提供像java里的線程類,一些同步的實(shí)現(xiàn)必須靠自己程序?qū)崿F(xiàn),稍顯復(fù)雜。
一般來說,在C++里面創(chuàng)建和終止線程的函數(shù)為:_beginthread和_endthread兩個(gè)函數(shù),當(dāng)然,也能夠用CreateThread和ExitThread。詳細(xì)的使用方式能夠查看msdn。
那么,怎么樣實(shí)現(xiàn)加鎖與同步呢?能夠使用createMutex函數(shù)以及createEvent方法等來實(shí)現(xiàn),詳細(xì)能夠參考下例:

#include?
< ?iostream >
#include?
< ?windows.h >

using ? namespace ?std;
#define ?BUFSIZE?5
int ?SharedBuffer[BUFSIZE];
int ?head,tail;
int ?count;
HANDLE?hMutex;
HANDLE?hNotFullEvent,?hNotEmptyEvent;
void ?BB_Producer()
{
int ?i;
for ?(i = 20 ;?i >= 0 ;?i -- )? {
while ( 1 )? {
WaitForSingleObject(hMutex,INFINITE);
if ?(count? == ?BUFSIZE)? {? // ?緩沖區(qū)滿
ReleaseMutex(hMutex);
// ?等待直到緩沖區(qū)非滿
WaitForSingleObject(hNotFullEvent,INFINITE);
continue ;
}

// ?得到相互排斥鎖且緩沖區(qū)非滿,跳出while循環(huán)
break ;
}

// ?得到相互排斥鎖且緩沖區(qū)非滿,開始產(chǎn)生新數(shù)據(jù)
cout? << ? " Produce:? " ? << ?i? << ?endl;
SharedBuffer[tail]?
= ?i;
tail?
= ?(tail + 1 )? % ?BUFSIZE;
count
++ ;
ReleaseMutex(hMutex);?
// ?結(jié)束臨界區(qū)
PulseEvent(hNotEmptyEvent);? // ?喚醒消費(fèi)者線程
}

}

void ?BB_Consumer()
{
int ?result;
while ?( 1 )? {
WaitForSingleObject(hMutex,INFINITE);
if ?(count? == ? 0 )? {? // ?沒有能夠處理的數(shù)據(jù)
ReleaseMutex(hMutex);? // ?釋放相互排斥鎖且等待
// ?等待直到緩沖區(qū)非空
WaitForSingleObject(hNotEmptyEvent,INFINITE);
}

else ? if ?(SharedBuffer[head]? == ? 0 )? {
cout?
<< ? " Consumed?0:?end?of?data " ? << ?endl;
ReleaseMutex(hMutex);?
// ?結(jié)束臨界區(qū)
ExitThread( 0 );
}

else ? {? // ?獲得相互排斥鎖且緩沖區(qū)有數(shù)據(jù),開始處理
result? = ?SharedBuffer[head];
cout?
<< ? " Consumed:? " ? << ?result? << ?endl;
head?
= ?(head + 1 )? % ?BUFSIZE;
count
-- ;
ReleaseMutex(hMutex);?
// ?結(jié)束臨界區(qū)
PulseEvent(hNotFullEvent);? // ?喚醒生產(chǎn)者線程
}

}

}

void ?main()
{
HANDLE?hThreadVector[
2 ];
DWORD?ThreadID;
count?
= ? 0 ;
head?
= ? 0 ;
tail?
= ? 0 ;
hMutex?
= ?CreateMutex(NULL,FALSE,NULL);
hNotFullEvent?
= ?CreateEvent(NULL,TRUE,FALSE,NULL);
hNotEmptyEvent?
= ?CreateEvent(NULL,TRUE,FALSE,NULL);
hThreadVector[
0 ]? = ?CreateThread?(NULL,? 0 ,
(LPTHREAD_START_ROUTINE)?BB_Producer,
NULL,?
0 ,?(LPDWORD) & ThreadID);
hThreadVector[
1 ]? = ?CreateThread?(NULL,? 0 ,
(LPTHREAD_START_ROUTINE)?BB_Consumer,
NULL,?
0 ,?(LPDWORD) & ThreadID);
WaitForMultipleObjects(
2 ,hThreadVector,TRUE,INFINITE);
}
這是一個(gè)典型的生產(chǎn)者-消費(fèi)者問題,它們公用的資源是SharedBuffer,當(dāng)Buffer中有數(shù)據(jù)且未滿時(shí),兩個(gè)線程都能夠執(zhí)行,當(dāng)Buffer為 空時(shí),Consumer就要等待,直到Buffer不為空,這里就是用event來實(shí)現(xiàn)的;相同,當(dāng)Buffer為滿時(shí),Producer就要等待。

發(fā)表于 @ 2006年10月29日 19:54:00 | 評(píng)論( 2 ) | 編輯

新一篇:?特洛伊木馬(一) ?|? 舊一篇:?用戶接口與作業(yè)調(diào)度


Windows API一日一練(45)CreateEvent和SetEvent函數(shù) 收藏

新一篇:?Windows API一日一練(46)EnterCriticalSection和LeaveCriticalSection函數(shù) ?|? 舊一篇:?Windows API一日一練(44)wsprintf函數(shù)

當(dāng)你創(chuàng)建一個(gè)線程時(shí),事實(shí)上那個(gè)線程是一個(gè)循環(huán),不像上面那樣僅僅執(zhí)行一次的。這樣就帶來了一個(gè)問題,在那個(gè)死循環(huán)里要找到合適的條件退出那個(gè)死循環(huán),那么是怎么樣實(shí)現(xiàn)它的呢?在 Windows 里往往是採(cǎi)用事件的方式,當(dāng)然還能夠採(cǎi)用其他的方式。在這里先介紹採(cǎi)用事件的方式來通知從線程執(zhí)行函數(shù)退出來,它的實(shí)現(xiàn)原理是這樣,在那個(gè)死循環(huán)里不斷地使用 WaitForSingleObject 函數(shù)來檢查事件是否滿足,假設(shè)滿足就退出線程,不滿足就繼續(xù)執(zhí)行。當(dāng)在線程里執(zhí)行堵塞的函數(shù)時(shí),就須要在退出線程時(shí),先要把堵塞狀態(tài)變成非堵塞狀態(tài),比方使用一個(gè)線程去接收網(wǎng)絡(luò)數(shù)據(jù),同一時(shí)候使用堵塞的 SOCKET 時(shí),那么要先關(guān)閉 SOCKET ,再發(fā)送事件信號(hào),才干夠退出線程的。以下就來演示怎么樣使用事件來通知線程退出來。
?
函數(shù) CreateEvent 聲明例如以下:
?
WINBASEAPI
__out
HANDLE
WINAPI
CreateEventA(
??? __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
??? __in???? BOOL bManualReset,
??? __in???? BOOL bInitialState,
??? __in_opt LPCSTR lpName
??? );
WINBASEAPI
__out
HANDLE
WINAPI
CreateEventW(
??? __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
??? __in???? BOOL bManualReset,
??? __in???? BOOL bInitialState,
??? __in_opt LPCWSTR lpName
??? );
#ifdef UNICODE
#define CreateEvent?CreateEventW
#else
#define CreateEvent?CreateEventA
#endif // !UNICODE
lpEventAttributes 是事件的屬性。
bManualReset 是指事件手動(dòng)復(fù)位,還是自己主動(dòng)復(fù)位狀態(tài)。
bInitialState 是初始化的狀態(tài)是否處于有信號(hào)的狀態(tài)。
lpName 是事件的名稱,假設(shè)有名稱,能夠跨進(jìn)程共享事件狀態(tài)。
?
調(diào)用這個(gè)函數(shù)的樣例例如以下:
#001?#pragma once
#002?
#003?// 線程類。
#004?// 蔡軍生 2007/09/23 QQ:9073204
#005?class CThread
#006?{
#007?public:
#008?
#009??CThread(void)
#010??{
#011 ???????? m_hThread = NULL;
#012 ???????? m_hEventExit = NULL;
#013??}
#014?
#015??virtual ~CThread(void)
#016??{
#017???????? if (m_hThread)
#018???????? {
#019?????????????? // 刪除的線程資源。
#020?????????????? ::CloseHandle(m_hThread);
#021???????? }
#022?
#023???????? if (m_hEventExit)
#024???????? {
#025?????????????? // 刪除事件。
#026?????????????? ::CloseHandle(m_hEventExit);
#027???????? }
#028????????
#029??}
#030?
#031??// 創(chuàng)建線程
#032??HANDLE CreateThread(void)
#033??{
#034???????? // 創(chuàng)建退出事件。
#035 ??????? m_hEventExit = ::CreateEvent(NULL,TRUE,FALSE,NULL);
#036???????? if (!m_hEventExit)
#037 ???????? {
#038?????????????? // 創(chuàng)建事件失敗。
#039?????????????? return NULL;
#040???????? }
#041?
#042???????? // 創(chuàng)建線程。
#043 ???????? m_hThread = ::CreateThread(
#044?????????????? NULL,??????????????????? // 安全屬性使用缺省。
#045?????????????? 0,???????????????????????? // 線程的堆棧大小。
#046?????????????? ThreadProc,???????????????? // 線程執(zhí)行函數(shù)地址。
#047?????????????? this,????????????????????? // 傳給線程函數(shù)的參數(shù)。
#048?????????????? 0,???????????????????????? // 創(chuàng)建標(biāo)志。
#049?????????????? &m_dwThreadID);??????? // 成功創(chuàng)建后的線程標(biāo)識(shí)碼。
#050?
#051???????? return m_hThread;
#052??}
#053?
#054??// 等待線程結(jié)束。
#055??void WaitFor(DWORD dwMilliseconds = INFINITE)
#056??{
#057???????? // 發(fā)送退出線程信號(hào)。
#058??????? ::SetEvent(m_hEventExit);
#059?
#060???????? // 等待線程結(jié)束。
#061???????? ::WaitForSingleObject(m_hThread,dwMilliseconds);
#062??}
#063?
#064?protected:
#065??//
#066??// 線程執(zhí)行函數(shù)。
#067??// 蔡軍生 2007/09/21
#068??//
#069??static DWORD WINAPI ThreadProc(LPVOID lpParameter)
#070??{
#071???????? // 轉(zhuǎn)換傳送入來的參數(shù)。
#072???????? CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
#073???????? if (pThread)
#074???????? {
#075?????????????? // 線程返回碼。
#076?????????????? // 調(diào)用類的線程處理函數(shù)。
#077?????????????? return pThread->Run();
#078???????? }
#079????????
#080???????? //
#081???????? return -1;???????
#082??}
#083?
#084??// 線程執(zhí)行函數(shù)。
#085??// 在這里能夠使用類里的成員,也能夠讓派生類實(shí)現(xiàn)更強(qiáng)大的功能。
#086??// 蔡軍生 2007/09/25
#087??virtual DWORD Run(void)
#088??{
#089???????? // 輸出到調(diào)試窗體。
#090???????? ::OutputDebugString(_T("Run() 線程函數(shù)執(zhí)行 /r/n"));?????
#091?
#092???????? // 線程循環(huán)。
#093???????? for (;;)
#094???????? {
#095????????????? DWORD dwRet = WaitForSingleObject(m_hEventExit,0);
#096?????????????? if (dwRet == WAIT_TIMEOUT)
#097?????????????? {
#098??????????????????? // 能夠繼續(xù)執(zhí)行。 ????????????????
#099??????????????????? TCHAR chTemp[128];
#100??????????????????? wsprintf(chTemp,_T("ThreadID=%d/r/n"),m_dwThreadID);
#101??????????????????? ::OutputDebugString(chTemp);
#102?
#103?????????????? ????? // 眼下沒有做什么事情,就讓線程釋放一下 CPU 。
#104??????????????????? Sleep(10);
#105?????????????? }
#106?????????????? else if (dwRet == WAIT_OBJECT_0)
#107?????????????? {
#108??????????????????? // 退出線程。
#109??????????????????? ::OutputDebugString(_T("Run() 退出線程 /r/n"));
#110??????????????????? break;
#111?????????????? }
#112?????????????? else if (dwRet == WAIT_ABANDONED)
#113?????????????? {
#114??????????????????? // 出錯(cuò)。
#115??????????????????? ::OutputDebugString(_T("Run() 線程出錯(cuò) /r/n"));
#116??????????????????? return -1;
#117?????????????? }
#118???????? }
#119?
#120???????? return 0;
#121??}
#122?
#123?protected:
#124??HANDLE m_hThread;???????? // 線程句柄。
#125??DWORD m_dwThreadID;????????? // 線程 ID 。
#126?
#127??HANDLE m_hEventExit;??? // 線程退出事件。
#128?};
#129?
?
上面在第 35 行創(chuàng)建線程退出事件,第 95 行檢查事件是否可退出線程執(zhí)行,第 58 行設(shè)置退出線程的事件。
?

發(fā)表于 @ 2007年09月25日 21:32:00 | 評(píng)論( 0 ) | 編輯

新一篇:?Windows API一日一練(46)EnterCriticalSection和LeaveCriticalSection函數(shù) ?|? 舊一篇:?Windows API一日一練(44)wsprintf函數(shù)


Win32 API 經(jīng)常使用函數(shù)之二 收藏

新一篇:?Win32 API 經(jīng)常使用函數(shù)之三——注冊(cè)表操作(上) ?|? 舊一篇:?Win32 API 經(jīng)常使用函數(shù)之中的一個(gè)

【事件】
???? ? 事件用處多是控制線程間的同步。
??? ?? 最典型的應(yīng)用就是CreateThread之后等待線程函數(shù)的啟動(dòng)。如Main線程里CreateThread,它之后的操作依賴于子線程,那么它通常會(huì) 在CreateThread之后推斷HANDLE是否有效,然后進(jìn)入等待。(當(dāng)然在這之前,一個(gè)Event是已經(jīng)創(chuàng)建好的,并初始化為未通知狀態(tài))子線程 啟動(dòng)后完畢了初始化操作,并設(shè)置Event為已通知狀態(tài)。這時(shí),一直在等待該事件的Main線程發(fā)現(xiàn)該事件已經(jīng)得到通知,因此它就變成可調(diào)度線程。這時(shí) Main線程知道子線程已經(jīng)完畢了初始化操作。
??? ?? CreateEvent函數(shù)用于創(chuàng)建一個(gè)Event,其原型例如以下:
HANDLE?CreateEvent(
??LPSECURITY_ATTRIBUTES?lpEventAttributes,?
??BOOL?bManualReset,?
??BOOL?bInitialState,?
??LPTSTR?lpName?
);?
??? ?? 參數(shù)說明:
  1. 第一個(gè)參數(shù)同CreateThread相似,也是安全級(jí)別相關(guān),通常被被設(shè)置為NULL,以獲得默認(rèn)的安全級(jí)別。
  2. 第二個(gè)參數(shù)是個(gè)布爾值,它可以告訴系統(tǒng)是創(chuàng)建一個(gè)人工重置的事件(TRUE)還是創(chuàng)建一個(gè)自己主動(dòng)重置的事件( FALSE)。
  3. 第三個(gè)參數(shù)也是布爾值,用于指明該事件是要初始化為已通知狀態(tài)(TRUE)還是未通知狀態(tài)(FALSE)。
  4. 第四個(gè)參數(shù)是一個(gè)字符串,用于標(biāo)示這個(gè)事件的名字。
??? ?? 下面是具體說明:
  1. 已通知狀態(tài)和未通知狀態(tài)
    事件僅僅有兩種狀態(tài),已通知表示這個(gè)事件已經(jīng)被設(shè)置過了(能夠理解為發(fā)生了),未通知表示還沒有發(fā)生。一般設(shè)置為未通知狀態(tài),并由SetEvent設(shè)置為已 通知狀態(tài)。當(dāng)然也能夠反著做,CreateEvent時(shí)設(shè)置為已通知狀態(tài),然后由ResetEvent設(shè)置為未通知狀態(tài)。
  2. 人工重置與自己主動(dòng)重置
    自己主動(dòng)重置的事件定義了應(yīng)該成功等待的副作用規(guī)則,即當(dāng)線程成功地等待到該對(duì)象時(shí),自己主動(dòng)重置的事件就會(huì)自己主動(dòng)重置到未通知狀態(tài)。
    人工重置則須要調(diào)用ResetEvent函數(shù)設(shè)置為未通知狀態(tài)。
  3. 名字共享
    這個(gè)參數(shù)非常重要,Win32 API中有非常多方法有這個(gè)參數(shù),它遵從一種按名字共享的規(guī)則。
    假設(shè)傳入一個(gè)非NULL字符串(最多260個(gè)字符),那么在全局空間,共享該HANDLE,這個(gè)全局可以是跨進(jìn)程的名字空間,即在還有一個(gè)進(jìn)程中依舊可以使用該名字的HANDLE。
    假設(shè)希望避免這樣的全局范圍內(nèi)的共享,那么應(yīng)該傳入NULL,以一種匿名的方式創(chuàng)建Event等,這樣,它僅僅在當(dāng)前線程內(nèi)可見。
??? ??? 當(dāng)進(jìn)程A創(chuàng)建了一個(gè)Event后,如CreateEvent(NULL,F(xiàn)ALSE,F(xiàn)LASE,_T(“UniqueEvent”));進(jìn)程B相同創(chuàng)建 了一個(gè)Event,也想起名字為UniqueEvent,那么就會(huì)出現(xiàn)故障:CreateEvent(NULL,F(xiàn)ALSE,F(xiàn)ALSE,_T (“UniqueEvent”));系統(tǒng)會(huì)首先查看是否已經(jīng)存在了一個(gè)名字為“UniqueEvent”的對(duì)象,因?yàn)榇_實(shí)存在了一個(gè)帶有改名字的內(nèi)核對(duì) 象,因此內(nèi)核要檢查對(duì)象類型,相同是一 個(gè)Event,那么系統(tǒng)會(huì)運(yùn)行一次安全檢查,以確定調(diào)用者是否擁有對(duì)該對(duì)象的完整訪問權(quán)。假設(shè)有這樣的訪問權(quán),系統(tǒng)會(huì)在進(jìn)程B的句柄表里找到一個(gè)空項(xiàng)目,對(duì) 其初始化,使得該項(xiàng)指向現(xiàn)有的內(nèi)核對(duì)象。假設(shè)類型不匹配,或者拒絕訪問,那么進(jìn)程B的CreateEvent會(huì)失敗。
??? ?? 應(yīng)用程序可以確定它是否確實(shí)創(chuàng)建了一個(gè)新內(nèi)核對(duì)象,而不是打開了一個(gè)現(xiàn)有的對(duì)象。方法是在調(diào)用C r e a t e *函數(shù)后馬上調(diào)用G e t L a s t E r r o r:假設(shè)為ERROR_ALREADY_EXISTS,那么表示系統(tǒng)內(nèi)已經(jīng)存在了這樣名字的對(duì)象。
??? ?? Open*是去查看名字空間中是否有這個(gè)名字的內(nèi)核對(duì)象存在調(diào)用C r e a t e *函數(shù)與調(diào)用O p e n *函數(shù)之間的主要區(qū)別是,假設(shè)對(duì)象并不存在,那么C r e a t e *函數(shù)將創(chuàng)建該對(duì)象,而O p e n *函數(shù)則執(zhí)行失敗。

??? ?? PulseEvent函數(shù)使得事件變?yōu)橐淹ㄖ獱顟B(tài),然后馬上又變?yōu)槲赐ㄖ獱顟B(tài),這就像在調(diào)用SetEvent后又馬上調(diào)用ResetEvent函數(shù)一樣。 假設(shè)在人工重置的事件上調(diào)用PulseEvent函數(shù),那么在發(fā)出該事件時(shí),等待該事件的不論什么一個(gè)線程或全部線程將變?yōu)榭烧{(diào)度線程。假設(shè)在自己主動(dòng)重置事件上 調(diào)用P u l s e E v e n t函數(shù),那么僅僅有一個(gè)等待該事件的線程變?yōu)榭烧{(diào)度線程。假設(shè)在發(fā)出事件時(shí)沒有不論什么線程在等待該事件,那么將不起不論什么作用。

【等待函數(shù)】
??? ?? 等待函數(shù)用來監(jiān)聽事件的已通知狀態(tài)。WaitForSingleObject和WaitForMultipleObjects兩個(gè)函數(shù)分別用以等待單個(gè)事件和多個(gè)事件。
DWORD?WaitForSingleObject(
??HANDLE?hHandle,
??DWORD?dwMilliseconds
);
DWORD?WaitForMultipleObjects(
??DWORD?nCount,
??
const ?HANDLE * ?lpHandles,
??BOOL?bWaitAll,
??DWORD?dwMilliseconds
);
??? ?? 從函數(shù)原型上來看可知,事件的含義是可以支持被通知/未通知的內(nèi)核對(duì)象(比如進(jìn)程和線程,當(dāng)傳入的是進(jìn)程或者線程句柄時(shí),他表示等該線程或進(jìn)程被標(biāo)識(shí)為終止執(zhí)行為止。)。
??? ?? dwMilliseconds 參數(shù)表明等待的時(shí)間,假設(shè)在這個(gè)時(shí)間段中事件為已通知狀態(tài),那么對(duì)于Single版本號(hào)將返回WAIT_OBJECT_0,對(duì)于Multiple版本號(hào)將返回 WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount– 1)。假設(shè)沒有等到將返回WAIT_TIMEOUT。
??? ?? Multiple版本號(hào)中的bWaitAll表示想要讓它使用何種方式等待。假設(shè)為該參數(shù)傳遞TRUE,那么在全部對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)之前,該函數(shù)將不同意調(diào)用線程執(zhí)行。通常是FALSE,即僅僅要有一個(gè)事件被對(duì)應(yīng),則線程可調(diào)度。

??? ??

發(fā)表于 @ 2007年10月28日 18:04:00 | 評(píng)論( 0 ) | 編輯

新一篇:?Win32 API 經(jīng)常使用函數(shù)之三——注冊(cè)表操作(上) ?|? 舊一篇:?Win32 API 經(jīng)常使用函數(shù)之中的一個(gè)

CreateEvent的使用方法


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 汉源县| 玉溪市| 句容市| 北票市| 昭苏县| 涿州市| 虞城县| 宜丰县| 四子王旗| 宝清县| 盐亭县| 杨浦区| 泉州市| 合作市| 大同市| 常山县| 玉田县| 庆云县| 华蓥市| 大方县| 邵阳县| 井陉县| 循化| 东安县| 灵丘县| 南岸区| 合水县| 灵寿县| 平顺县| 布尔津县| 阜城县| 山阴县| 楚雄市| 新营市| 延庆县| 上饶县| 柳河县| 从化市| 鸡泽县| 行唐县| 同江市|