WaitForSingleObject的用法

WaitForSingleObject的用法??????????????????????????????????????

?

1.WaitForSingleObject 的用法

				
DWORD
WaitForSingleObject(
?????????????????????HANDLE hHandle,?
?????????????????????DWORD dwMilliseconds				
??????????????????);

參數 hHandle 是一個事件的句柄,第二個參數 dwMilliseconds 是時間間隔。如果時間是有信號狀態返回 WAIT_OBJECT_0 ,如果時間超過 dwMilliseconds 值但時間事件還是無信號狀態則返回 WAIT_TIMEOUT

hHandle
可以是下列對象的句柄:
Change?notification?
Console?input?
Event?
Job?
Memory?resource?notification?
Mutex?
Process?
Semaphore?
Thread?
Waitable?timer?
?

WaitForSingleObject 函數用來檢測 hHandle 事件的信號狀態,當函數的執行時間超過 dwMilliseconds 就返回,但如果參數 dwMilliseconds INFINITE 時函數將直到相應時間事件變成有信號狀態才返回,否則就一直等待下去,直到 WaitForSingleObject 有返回直才執行后面的代碼。在這里舉個例子:

先創建一個全局 Event 對象 g_event:

??? CEvent g_event;

在程序中可以通過調用 CEvent::SetEvent 設置事件為有信號狀態。

下面是一個線程函數 MyThreadPro()

UINT CFlushDlg::MyThreadProc( LPVOID pParam )?
{

???? WaitForSingleObject(g_event,INFINITE);
???? For(;;)
??????? {?
???????? ………… .

??????? }?
???? return 0;?
}?

在這個線程函數中只有設置 g_event 為有信號狀態時才執行下面的 for 循環,因為 g_event 是全局變量,所以我們可以在別的線程中通過 g_event. SetEvent 控制這個線程。

還有一種用法就是我們可以通過 WaitForSingleObject 函數來間隔的執行一個線程函數的函數體

???? UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{?
???? while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
???? {
???????? ………………??
???? }?
???? return 0;
}??

在這個線程函數中可以可以通過設置 MT_INTERVAL 來控制這個線程的函數體多久執行一次,當事件為無信號狀態時函數體隔 MT_INTERVAL 執行一次,當設置事件為有信號狀態時,線程就執行完畢了。

2. WaitForSingleObject
當指定的對象處于有信號狀態或者等待時間結束的狀態時,此函數返回。
DWORD WaitForSingleObject(
??HANDLE hHandle,
??DWORD dwMilliseconds
);
參數:
hHandle:指定對象或事件的句柄;
dwMilliseconds: 等待時間,以毫妙為單位,當超過等待時間時,此函數將返回。如果該參數設置為0,則該函數立即返回,如果設置為INFINITE,則該函數直到有信號才返回。
返回值:
如果此函數成功,該函數的返回之標識了引起該函數返回的事件。返回值如下:
??WAIT_ABANDONED(0x00000080L)
??指定的對象是一個互斥對象,該對象沒有被擁有該對象的線程在線程結束前釋放。互斥對象的所有權被同意授予調用該函數的線程。互斥對象被設置成為無信號狀態。
??WAIT_OBJECT_0 (0x00000000L)
??指定的對象出有有信號狀態。
??WAIT_TIMEOUT (0x00000102L)
??超過等待時間,指定的對象處于無信號狀態
如果失敗,返回 WAIT_FAILED;
備注:
此函數檢查指定的對象或事件的狀態,如果該對象處于無信號狀態,則調用線程處于等待狀態,此時該線程不消耗CPU時間,
該函數可以等待如下對象:
??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、創建對話框應用程序,項目名稱為MyTestThread
2、添加按鈕,命名為啟動和停止,在對話框中增加編輯框,ID為IDC_TIME,
3、增加成員變量,HANDLE m_hThread[2],此為線程的句柄;
4、定義全局變量,用來控制線程的運行與否;
?? volatile BOOL m_ThreadRun[2];
5、增加全局事件對象,用來監控線程,控制線程是否運行。
?? CEvent event;
?? 注意:4、5定義的對象,必須在.cpp文件中定義;
6、聲明回調函數。回調函數必須是全局函數或靜態函數。聲明方式如下:
void ThreadFunc1(LPVOID pParam);
void ThreadFunc2(LPVOID pParam);
?? 回調函數的實現如下:
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為有信號狀態,則下邊的函數執行后,該線程則開始運行,如果event為無信號狀態,則下邊的函數執行

//后,該線程處于等待狀態,直到有信號才開始運行;
??::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、對啟動和停止按鈕增加消息響應函數,如下:
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);
}

編譯運行,設置斷點,可以查看運行情況。

?

轉載于:https://www.cnblogs.com/andyhere/archive/2008/10/20/1314803.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276773.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pom.xml里發布和下載包

1.下載包 在<project>標簽中 <repositories><repository><id>nexus</id><url>http://10.39.93.105:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots>&l…

智能云改-docker云遷移實戰

本次安裝的linux版本是centos7.4&#xff0c;docker安裝不依賴任何環境&#xff0c;但是必須要連接網絡&#xff0c;滿足這一點就可以進行docker安裝了。 一、安裝&#xff1a; 1.刪除就版本的docker輸入命令&#xff1a;yum -y remove docker \docker-common \docker-selinux …

python詞頻統計代碼_python統計詞頻

一、程序分析 &#xff08;1&#xff09;將文件讀入緩沖區&#xff08;dst指文本文件存放路徑&#xff0c;設置成形參&#xff0c;也可以不設&#xff0c;具體到函數里設置&#xff09; def process_file(dst): # 讀文件到緩沖區try: # 打開文件 txtopen(dst,"r") ex…

關于wpf,datagrid,雙向數據綁定用法解決方案

參考&#xff1a;http://www.myexception.cn/c-sharp/1446457.html 核心內容&#xff0c;在綁定數據的地方添加雙向綁定&#xff1a; {Binding BB, ModeTwoWay,UpdateSourceTriggerPropertyChanged} 轉載于:https://www.cnblogs.com/Mindy-hym/p/11431069.html

部署zookeeper分布式節點

用2臺服務器&#xff0c;低資源&#xff0c;部署3個zookeeper分布式節點&#xff1a; 1.準備環境系統已經配置好了JAVA環境&#xff1b;下載某個版本的zookeeper壓縮包&#xff0c;下載鏈接&#xff1a;http://apache.claz.org/zookeeper/zookeeper-3.5.3-beta/zookeeper-3.5.3…

Oracle的resouce、unlimited tablespace 及如何把數據導入不同的表空間

resouce是角色&#xff0c;unlimited tablespace是權限。 很多人在進行數據遷移時&#xff0c;希望把數據導入不同于原系統的表空間&#xff0c;在導入之后卻往往發現&#xff0c;數據被導入了原表空間。本例舉例說明解決這個問題:1.如果缺省的用戶具有DBA權限那么導入時會按照…

MySQL導入導出遠程訪問命令

1.導出整個數據庫mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql2.導出一個表mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql3.導出一個數據庫結…

.net開發是做什么的_軟件開發是什么, 該怎么做?

軟件開發是什么, 該怎么做&#xff1f;1 引子關于什么是軟件開發存在很多觀點&#xff0c;有的認為軟件開發即服務&#xff0c;有的認為軟件開發即產品&#xff0c;有的認為軟件開發即平臺&#xff0c;這些觀點各有各的側重點。這篇文章我們來學習和探討一下軟件開發。2 軟件…

虛擬軟驅影像文件制作程序下載路徑:http://download.csdn.net/source/738137

通過這個程序&#xff0c;可制作一個在虛擬機上運行的Hello China啟動軟盤&#xff0c;而無需你的計算機具備物理軟驅。 If you have not CSDN account or you very care the 3 points will be omitted if you download,please send mail to garryxinyahoo.com.cn, I will send…

css3屬性

css3屬性 transform動畫 transform-origin&#xff1a;設置不動點&#xff0c;以這個點位移transform&#xff1a;translate(x,y):自身偏移量transform:scale(x,y)&#xff1a;縮放&#xff0c;當為負數的時候可以實現反轉元素transform&#xff1a;roate&#xff08;xdeg&…

使用HTML5、CSS3和jQuery增強網站用戶體驗

記得幾年前如果你需要添加一些互動元素到你的網站中用來改善用戶體驗&#xff1f;是不是立刻就想到了flash實現&#xff1f;這彷佛年代久遠的事了。使用現在最流行的Web技術HTML5&#xff0c;CSS3和jQuery&#xff0c;同樣也可以實現類似的用戶體驗。而且使用這些特性將會比使用…

python中loop函數_python + Django 的forloop功能試驗講解

一、forloop功能詳解記錄 遇到一個問題困擾了我好久&#xff0c;結果還是知識盲區造成的。下邊記錄一下。 通過return forloop可以返回前端循環中的索引值 二、forloop大概功能 forloop是Django模板中一個功能&#xff0c;主要是可以計算循環的對象的索引值&#xff08;大白話大…

帆軟報表(finereport)JS實現cpt中詳細單元格刷新

1.刷新固定單元格 setInterval(function(){ //獲取第二行第 5 列 E2 單元格對象var _changeCell $("tr[tridx1]","div.content-container").children().eq(7);//獲取 H2 單元格值var _changeVal _changeCell.text();//給表格賦值 if(_changeVal"…

[導入]源代碼版本控制(二)

在VS6.0時代&#xff0c;VSS的版本是6.0&#xff0c;現在VS的版本都到2008了&#xff0c;VSS的版本目前是2005&#xff0c;這回以2005為例。安裝就免了。數據庫的創建&#xff1a;如果要在局域網內共享這個數據庫&#xff0c;那還需要將剛才存放數據庫的目錄共享出去。為數據庫…

javascript 控制彈出窗口

前言:經常上網的朋友可能會到過這樣一些網站&#xff0c;一進入首頁立刻會彈出一個窗口&#xff0c;或者按一個連接或按鈕彈出&#xff0c;通常在這個窗口里會顯示一些注意事項、版權信息 、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容…

蘇寧的Node.js實踐:不低于Java的渲染性能、安全穩定迭代快

前端 Node.js 的使用場景大多集中在前端工具上&#xff0c;當前的前端主要把它定位為輔助。蘇寧易購使用 Node.js 作為前后端分離的主要手段&#xff0c;經歷了從技術引進到全面開花&#xff0c;從邊緣功能到核心業務&#xff0c;從紛亂到穩定的過程。同時 Node.js 作為新引入的…

wpf: DataGridTextColumn 數字格式顯示,編輯時取消格式(StringFormat)

參考&#xff1a;Format values in a Datagrid 參考&#xff1a;Remove stringFormat while editing cell in datagrid 使用 DataGridTemplateColumn 實現&#xff1a; <DataGridTemplateColumn Header"Cot (k€)"><DataGridTemplateColumn.CellTemplate&g…

MVP群聊某美國公司的應聘試題(壓死九個還是一個)

某美國公司的應聘試題&#xff08;壓死九個還是一個&#xff09;&#xff0c;測試你的管理方式有二條鐵軌&#xff0c;一條新的&#xff0c;一條舊的。有了新鐵軌后&#xff0c;舊鐵軌不再有火車通過。有一天有十個小孩到鐵軌上玩耍&#xff0c;九個小孩在新鐵軌上玩&#xff0…

JS的常用正則表達式 驗證密碼

JS的正則表達式強&#xff1a;字母數字特殊字符 ^(?![a-zA-z]$)(?!\d$)(?![!#$%^&*]$)(?![a-zA-z\d]$)(?![a-zA-z!#$%^&*]$)(?![\d!#$%^&*]$)[a-zA-Z\d!#$%^&*]$中&#xff1a;字母數字&#xff0c;字母特殊字符&#xff0c;數字特殊字符^(?![a-zA-z]$)…

微軟宣布開源WPF、WinForms和WinUI

在微軟Connect 2018大會上&#xff0c;微軟發布了.NET Core 3.0的第一個預覽版。同時&#xff0c;微軟還宣布&#xff0c;他們將WPF、Windows Forms&#xff08;WinForms&#xff09;和WinUI作為開源項目托管在GitHub上。它們都是基于MIT許可發行&#xff0c;開發人員可以在自己…