WaitForSingleObject的用法
?
1.WaitForSingleObject 的用法
DWORD WaitForSingleObject( ?????????????????????HANDLE hHandle,? ?????????????????????DWORD dwMilliseconds ??????????????????);參數(shù) hHandle 是一個(gè)事件的句柄,第二個(gè)參數(shù) dwMilliseconds 是時(shí)間間隔。如果時(shí)間是有信號(hào)狀態(tài)返回 WAIT_OBJECT_0 ,如果時(shí)間超過(guò) dwMilliseconds 值但時(shí)間事件還是無(wú)信號(hào)狀態(tài)則返回 WAIT_TIMEOUT 。
hHandle 可以是下列對(duì)象的句柄:
Change?notification?
Console?input?
Event?
Job?
Memory?resource?notification?
Mutex?
Process?
Semaphore?
Thread?
Waitable?timer??
WaitForSingleObject 函數(shù)用來(lái)檢測(cè) hHandle 事件的信號(hào)狀態(tài),當(dāng)函數(shù)的執(zhí)行時(shí)間超過(guò) dwMilliseconds 就返回,但如果參數(shù) dwMilliseconds 為 INFINITE 時(shí)函數(shù)將直到相應(yīng)時(shí)間事件變成有信號(hào)狀態(tài)才返回,否則就一直等待下去,直到 WaitForSingleObject 有返回直才執(zhí)行后面的代碼。在這里舉個(gè)例子:
先創(chuàng)建一個(gè)全局 Event 對(duì)象 g_event:
??? CEvent g_event;
在程序中可以通過(guò)調(diào)用 CEvent::SetEvent 設(shè)置事件為有信號(hào)狀態(tài)。
下面是一個(gè)線程函數(shù) MyThreadPro()
UINT CFlushDlg::MyThreadProc( LPVOID pParam )?
{
???? WaitForSingleObject(g_event,INFINITE);
???? For(;;)
??????? {?
???????? ………… .
??????? }?
???? return 0;?
}?
在這個(gè)線程函數(shù)中只有設(shè)置 g_event 為有信號(hào)狀態(tài)時(shí)才執(zhí)行下面的 for 循環(huán),因?yàn)?/span> g_event 是全局變量,所以我們可以在別的線程中通過(guò) g_event. SetEvent 控制這個(gè)線程。
還有一種用法就是我們可以通過(guò) WaitForSingleObject 函數(shù)來(lái)間隔的執(zhí)行一個(gè)線程函數(shù)的函數(shù)體
???? UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{?
???? while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
???? {
???????? ………………??
???? }?
???? return 0;
}??
在這個(gè)線程函數(shù)中可以可以通過(guò)設(shè)置 MT_INTERVAL 來(lái)控制這個(gè)線程的函數(shù)體多久執(zhí)行一次,當(dāng)事件為無(wú)信號(hào)狀態(tài)時(shí)函數(shù)體隔 MT_INTERVAL 執(zhí)行一次,當(dāng)設(shè)置事件為有信號(hào)狀態(tài)時(shí),線程就執(zhí)行完畢了。
2. WaitForSingleObject
當(dāng)指定的對(duì)象處于有信號(hào)狀態(tài)或者等待時(shí)間結(jié)束的狀態(tài)時(shí),此函數(shù)返回。
DWORD WaitForSingleObject(
??HANDLE hHandle,
??DWORD dwMilliseconds
);
參數(shù):
hHandle:指定對(duì)象或事件的句柄;
dwMilliseconds: 等待時(shí)間,以毫妙為單位,當(dāng)超過(guò)等待時(shí)間時(shí),此函數(shù)將返回。如果該參數(shù)設(shè)置為0,則該函數(shù)立即返回,如果設(shè)置為INFINITE,則該函數(shù)直到有信號(hào)才返回。
返回值:
如果此函數(shù)成功,該函數(shù)的返回之標(biāo)識(shí)了引起該函數(shù)返回的事件。返回值如下:
??WAIT_ABANDONED(0x00000080L)
??指定的對(duì)象是一個(gè)互斥對(duì)象,該對(duì)象沒(méi)有被擁有該對(duì)象的線程在線程結(jié)束前釋放?;コ鈱?duì)象的所有權(quán)被同意授予調(diào)用該函數(shù)的線程?;コ鈱?duì)象被設(shè)置成為無(wú)信號(hào)狀態(tài)。
??WAIT_OBJECT_0 (0x00000000L)
??指定的對(duì)象出有有信號(hào)狀態(tài)。
??WAIT_TIMEOUT (0x00000102L)
??超過(guò)等待時(shí)間,指定的對(duì)象處于無(wú)信號(hào)狀態(tài)
如果失敗,返回 WAIT_FAILED;
備注:
此函數(shù)檢查指定的對(duì)象或事件的狀態(tài),如果該對(duì)象處于無(wú)信號(hào)狀態(tài),則調(diào)用線程處于等待狀態(tài),此時(shí)該線程不消耗CPU時(shí)間,
該函數(shù)可以等待如下對(duì)象:
??Change notification
??Console input
??Event
??Job
??Memory resource notification
??Mutex
??Process
??Semaphore
??Thread
??Waitable timer
需求:
Client Requires Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header Declared in Winbase.h; include Windows.h.??
Library Link to Kernel32.lib.????
DLL Requires Kernel32.dll.??
程序舉例:
1、創(chuàng)建對(duì)話框應(yīng)用程序,項(xiàng)目名稱為MyTestThread
2、添加按鈕,命名為啟動(dòng)和停止,在對(duì)話框中增加編輯框,ID為IDC_TIME,
3、增加成員變量,HANDLE m_hThread[2],此為線程的句柄;
4、定義全局變量,用來(lái)控制線程的運(yùn)行與否;
?? volatile BOOL m_ThreadRun[2];
5、增加全局事件對(duì)象,用來(lái)監(jiān)控線程,控制線程是否運(yùn)行。
?? CEvent event;
?? 注意:4、5定義的對(duì)象,必須在.cpp文件中定義;
6、聲明回調(diào)函數(shù)?;卣{(diào)函數(shù)必須是全局函數(shù)或靜態(tài)函數(shù)。聲明方式如下:
void ThreadFunc1(LPVOID pParam);
void ThreadFunc2(LPVOID pParam);
?? 回調(diào)函數(shù)的實(shí)現(xiàn)如下:
void ThreadFunc1(LPVOID pParam)
{
??CTime time;
??CString strTime;
??event.ResetEvent();
??m_ThreadRun[0] = true;
??m_ThreadRun[1] = true;
??DWORD ThreadID = ::GetCurrentThreadId();
??while(m_ThreadRun[0])
??{
?? time = CTime::GetCurrentTime();
?? strTime = time.Format("%H:%M:%S");
?? CMyTestThreadDlg* pDlg = (CMyTestThreadDlg*)pParam;
?? pDlg->SetDlgItemText(IDC_TIME,strTime);
?? Sleep(1000);
??}
}
void ThreadFunc2(LPVOID pParam)
{
??
??CTime time;
??CString strTime;
??DWORD ThreadID = ::GetCurrentThreadId();
//event為有信號(hào)狀態(tài),則下邊的函數(shù)執(zhí)行后,該線程則開(kāi)始運(yùn)行,如果event為無(wú)信號(hào)狀態(tài),則下邊的函數(shù)執(zhí)行
//后,該線程處于等待狀態(tài),直到有信號(hào)才開(kāi)始運(yùn)行;
??::WaitForSingleObject(event,INFINITE);
??while(m_ThreadRun[1])
??{
?? time = CTime::GetCurrentTime();
?? strTime = time.Format("%H:%M:%S");
?? CMyTestThreadDlg* pDlg = (CMyTestThreadDlg*)pParam;
?? pDlg->SetDlgItemText(IDC_TIME,"OK");
?? Sleep(1000);
?? ::WaitForSingleObject(event,INFINITE);
??}
}
7、定義保存線程ID的成員變量:DWORD m_ThreadID[2];
8、對(duì)啟動(dòng)和停止按鈕增加消息響應(yīng)函數(shù),如下:
void CMyTestThreadDlg::OnBnClickedOk()
{
??// TODO: 在此添加控件通知處理程序代碼
??m_hThread[0] = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,this,0,&m_ThreadID[0]);
??m_hThread[1] = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,this,0,&m_ThreadID[1]);
??GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
??GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
}
void CMyTestThreadDlg::OnBnClickedCancel()
{
??m_ThreadRun[0] = false;
??event.SetEvent();
??GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
??GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
}
編譯運(yùn)行,設(shè)置斷點(diǎn),可以查看運(yùn)行情況。
?
轉(zhuǎn)載于:https://www.cnblogs.com/andyhere/archive/2008/10/20/1314803.html
總結(jié)
以上是生活随笔為你收集整理的WaitForSingleObject的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: R语言及其IDE(RStudio)下载安
- 下一篇: 递归算法整理合集