WaitForSingleObject的用法
?
1.WaitForSingleObject 的用法
DWORD WaitForSingleObject( ?????????????????????HANDLE hHandle,? ?????????????????????DWORD dwMilliseconds ??????????????????);參數(shù) hHandle 是一個事件的句柄,第二個參數(shù) dwMilliseconds 是時間間隔。如果時間是有信號狀態(tài)返回 WAIT_OBJECT_0 ,如果時間超過 dwMilliseconds 值但時間事件還是無信號狀態(tài)則返回 WAIT_TIMEOUT 。
hHandle 可以是下列對象的句柄:
Change?notification?
Console?input?
Event?
Job?
Memory?resource?notification?
Mutex?
Process?
Semaphore?
Thread?
Waitable?timer??
WaitForSingleObject 函數(shù)用來檢測 hHandle 事件的信號狀態(tài),當(dāng)函數(shù)的執(zhí)行時間超過 dwMilliseconds 就返回,但如果參數(shù) dwMilliseconds 為 INFINITE 時函數(shù)將直到相應(yīng)時間事件變成有信號狀態(tài)才返回,否則就一直等待下去,直到 WaitForSingleObject 有返回直才執(zhí)行后面的代碼。在這里舉個例子:
先創(chuàng)建一個全局 Event 對象 g_event:
??? CEvent g_event;
在程序中可以通過調(diào)用 CEvent::SetEvent 設(shè)置事件為有信號狀態(tài)。
下面是一個線程函數(shù) MyThreadPro()
UINT CFlushDlg::MyThreadProc( LPVOID pParam )?
{
???? WaitForSingleObject(g_event,INFINITE);
???? For(;;)
??????? {?
???????? ………… .
??????? }?
???? return 0;?
}?
在這個線程函數(shù)中只有設(shè)置 g_event 為有信號狀態(tài)時才執(zhí)行下面的 for 循環(huán),因?yàn)?/span> g_event 是全局變量,所以我們可以在別的線程中通過 g_event. SetEvent 控制這個線程。
還有一種用法就是我們可以通過 WaitForSingleObject 函數(shù)來間隔的執(zhí)行一個線程函數(shù)的函數(shù)體
???? UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{?
???? while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
???? {
???????? ………………??
???? }?
???? return 0;
}??
在這個線程函數(shù)中可以可以通過設(shè)置 MT_INTERVAL 來控制這個線程的函數(shù)體多久執(zhí)行一次,當(dāng)事件為無信號狀態(tài)時函數(shù)體隔 MT_INTERVAL 執(zhí)行一次,當(dāng)設(shè)置事件為有信號狀態(tài)時,線程就執(zhí)行完畢了。
2. WaitForSingleObject
當(dāng)指定的對象處于有信號狀態(tài)或者等待時間結(jié)束的狀態(tài)時,此函數(shù)返回。
DWORD WaitForSingleObject(
??HANDLE hHandle,
??DWORD dwMilliseconds
);
參數(shù):
hHandle:指定對象或事件的句柄;
dwMilliseconds: 等待時間,以毫妙為單位,當(dāng)超過等待時間時,此函數(shù)將返回。如果該參數(shù)設(shè)置為0,則該函數(shù)立即返回,如果設(shè)置為INFINITE,則該函數(shù)直到有信號才返回。
返回值:
如果此函數(shù)成功,該函數(shù)的返回之標(biāo)識了引起該函數(shù)返回的事件。返回值如下:
??WAIT_ABANDONED(0x00000080L)
??指定的對象是一個互斥對象,該對象沒有被擁有該對象的線程在線程結(jié)束前釋放?;コ鈱ο蟮乃袡?quán)被同意授予調(diào)用該函數(shù)的線程?;コ鈱ο蟊辉O(shè)置成為無信號狀態(tài)。
??WAIT_OBJECT_0 (0x00000000L)
??指定的對象出有有信號狀態(tài)。
??WAIT_TIMEOUT (0x00000102L)
??超過等待時間,指定的對象處于無信號狀態(tài)
如果失敗,返回 WAIT_FAILED;
備注:
此函數(shù)檢查指定的對象或事件的狀態(tài),如果該對象處于無信號狀態(tài),則調(diào)用線程處于等待狀態(tài),此時該線程不消耗CPU時間,
該函數(shù)可以等待如下對象:
??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)建對話框應(yīng)用程序,項(xiàng)目名稱為MyTestThread
2、添加按鈕,命名為啟動和停止,在對話框中增加編輯框,ID為IDC_TIME,
3、增加成員變量,HANDLE m_hThread[2],此為線程的句柄;
4、定義全局變量,用來控制線程的運(yùn)行與否;
?? volatile BOOL m_ThreadRun[2];
5、增加全局事件對象,用來監(jiān)控線程,控制線程是否運(yùn)行。
?? CEvent event;
?? 注意:4、5定義的對象,必須在.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為有信號狀態(tài),則下邊的函數(shù)執(zhí)行后,該線程則開始運(yùn)行,如果event為無信號狀態(tài),則下邊的函數(shù)執(zhí)行
//后,該線程處于等待狀態(tà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、對啟動和停止按鈕增加消息響應(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的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言及其IDE(RStudio)下载安
- 下一篇: 递归算法整理合集