欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
CEvent類(lèi)祥解

CEvent類(lèi)祥解       我要收藏

2008-01-23 09:34:07

CEvent類(lèi)祥解
CEvent 類(lèi)提供了對事件的支持。事件是一個(gè)允許一個(gè)線(xiàn)程在某種情況發(fā)生時(shí),喚醒另外一個(gè)線(xiàn)程的同步對象。事件告訴線(xiàn)程何時(shí)去執行某一給定的任務(wù),從而使多個(gè)線(xiàn)程流平滑。例如在某些網(wǎng)絡(luò )應用程序中,一個(gè)線(xiàn)程(記為A)負責監聽(tīng)通信端口,另一個(gè)線(xiàn)程(記為B)負責更新用戶(hù)數據。通過(guò)使用CEvent類(lèi),線(xiàn)程A可以通知線(xiàn)程B何時(shí)更新用戶(hù)數據,這樣線(xiàn)程B可以盡快地更新用戶(hù)數據。每一個(gè)CEvent對象可以有兩種狀態(tài):有信號狀態(tài)(signaled)和無(wú)信號狀態(tài)(nonsignaled)。線(xiàn)程監視位于其中的CEvent類(lèi)對象的狀態(tài),并在相應的時(shí)候采取相應的操作。
     在MFC中,CEvent類(lèi)對象有兩種類(lèi)型,分別是所謂的人工事件和自動(dòng)事件。對于自動(dòng)事件,當其獲得信號后,就會(huì )釋放下一個(gè)可用的線(xiàn)程。一個(gè)自動(dòng) CEvent對象在被至少一個(gè)線(xiàn)程釋放后會(huì )自動(dòng)返回到無(wú)信號狀態(tài);而人工事件對象獲得信號后,釋放所有可利用線(xiàn)程,直到調用成員函數ReSetEvent ()將其設置為無(wú)信號狀態(tài)時(shí)為止。注意,在創(chuàng )建CEvent類(lèi)的對象時(shí),默認創(chuàng )建的是自動(dòng)事件。

CEvent的各成員函數的原型與參數說(shuō)明如下。
CEvent(BOOL bInitiallyOwn = FALSE,
BOOL bManualReset = FALSE,
LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );
 

bInitiallyOwn:若bInitiallyOwn為T(mén)RUE,則使CMultilock類(lèi)對象和CSingleLock類(lèi)對象的線(xiàn)程可用;否則,要訪(fǎng)問(wèn)資源的線(xiàn)程必須等待。該參數的默認值為FALSE。
bManualReset:指定要創(chuàng )建的CEvent對象是屬于手工事件還是自動(dòng)事件。為T(mén)RUE,則為手工事件,否則為自動(dòng)事件。該參數默認值為FALSE。
lpszName:指定要創(chuàng )建的事件對象的名,如果該事件對象將跨進(jìn)程使用,則此參數不能為NULL。如果該參數和一個(gè)已經(jīng)存在的CEvent對象相同,則該構造函數返回一個(gè)對這個(gè)已存在對象的引用;如果參數和一個(gè)已存在的非CEvent類(lèi)的同步對象(如CMutex)相同,則對象創(chuàng )建失??;
lpsaAttribute:指向SECURITY_ATTRIBUTES結構的指針,該參數決定要創(chuàng )建的事件對象的安全屬性,一般置為NULL。
在事件對象建成后,可以調用其成員函數來(lái)改變其狀態(tài)。
BOOL CEvent::SetEvent ();
 

將CEvent類(lèi)對象的狀態(tài)設置為有信號狀態(tài),并且釋放所有等待的線(xiàn)程;如果該事件是人工事件,則CEvent類(lèi)對象保持為有信號狀態(tài),直到調用成員函數ResetEvent()將其重新設為無(wú)信號狀態(tài)時(shí)為止,這樣該事件就可以釋放多個(gè)線(xiàn)程;如果CEvent類(lèi)對象為自動(dòng)事件,則在SetEvent()將事件設置為有信號狀態(tài)后,CEvent類(lèi)對象由系統自動(dòng)重置為無(wú)信號狀態(tài),除非一個(gè)線(xiàn)程被釋放。
如果該函數執行成功,則返回非零值,否則返回零。
BOOL CEvent::ResetEvent();
 

該函數將事件的狀態(tài)設置為無(wú)信號狀態(tài),并保持該狀態(tài)直至SetEvent()被調用時(shí)為止。由于自動(dòng)事件是由系統自動(dòng)重置,故自動(dòng)事件不需要調用該函數。
如果該函數執行成功,返回非零值,否則返回非零。
BOOL CEvent::PulseEvent()
 

發(fā)送一個(gè)事件脈沖,該函數完成一系列操作后才返回。對于自動(dòng)事件,PulseEvent()將事件設置為有信號狀態(tài),等待一個(gè)線(xiàn)程被釋放,將事件重置為無(wú)信號狀態(tài),然后PulseEvent()返回;對于人工事件,則將等待該事件的所有線(xiàn)程被釋放,事件被自動(dòng)重置為無(wú)信號狀態(tài),然后PulseEvent()返回。
一個(gè)CEvent對象在線(xiàn)程中被創(chuàng )建后,自動(dòng)處于無(wú)信號狀態(tài),但在另一個(gè)線(xiàn)程中可以調用Win32 API WaitForSingleObject()函數來(lái)監視其狀態(tài)。
該函數的原型及參數說(shuō)明如下:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
 
其中hHandle為指向要監視的同步對象的句柄,dwMilliseconds為監視hHandle所指向的對象所設置的超時(shí)值,單位為毫秒。當在線(xiàn)程的執行函數中調用該函數時(shí),線(xiàn)程暫時(shí)掛起,系統監視hHandle所指向的對象的狀態(tài)。
如果經(jīng)過(guò)dwMilliseconds毫秒后,hHandle指向的對象變?yōu)橛行盘枲顟B(tài),則WaitForSingleObject()返回,線(xiàn)程被釋放,且返回值為WAIT_TIMEOUT;
如果在掛起的dwMilliseconds毫秒內,線(xiàn)程所等待的對象在某一時(shí)刻變?yōu)橛行盘?,則該函數立即返回,返回值為WAIT_OBJECT_0。
參數dwMilliseconds有兩個(gè)具有特殊意義的值:0和INFINITE。若為0,則該函數立即返回;若為INFINITE,則線(xiàn)程一直被掛起,直到hHandle所指向的對象變?yōu)橛行盘枲顟B(tài)時(shí)為止。如果CEvent對象為自動(dòng)事件,則當WaitForSingleObject(hHandle,INFINITE)返回時(shí),自動(dòng)把CEvent對象重置為無(wú)信號狀態(tài)。CEvent::SetEvent()把對象設置為有信號狀態(tài),釋放等待的線(xiàn)程。CEvent::ResetEvent()把對象設置為無(wú)信號狀態(tài),程序在WaitForSingleObject(hHandle,INFINITE)處等待。
 
例程9 MultiThread9
建立一個(gè)基于對話(huà)框的工程MultiThread9,在對話(huà)框IDD_MULTITHREAD9_DIALOG中加入一個(gè)按鈕和兩個(gè)編輯框控件,按鈕的ID為IDC_WRITEW,標題為“寫(xiě)‘W’”;兩個(gè)編輯框的ID分別為IDC_W和IDC_D,屬性都選中Read-only;
在MultiThread9Dlg.h文件中聲明兩個(gè)線(xiàn)程函數:
UINT WriteW(LPVOID pParam);
UINT WriteD(LPVOID pParam);
使用ClassWizard分別給IDC_W和IDC_D添加CEdit類(lèi)變量m_ctrlW和m_ctrlD;
在MultiThread9Dlg.cpp文件中添加如下內容:
為了文件中能夠正確使用同步類(lèi),在文件開(kāi)頭添加
#include "afxmt.h"
定義事件對象和一個(gè)字符數組,為了能夠在不同線(xiàn)程間使用,定義為全局變量。
CEvent eventWriteD;
char g_Array[10];
添加線(xiàn)程函數:
UINT WriteW(LPVOID pParam)
{
 CEdit *pEdit=(CEdit*)pParam;
 pEdit->SetWindowText("");
 for(int i=0;i<10;i++)
 {
  g_Array[i]=''W'';
      pEdit->SetWindowText(g_Array);
  Sleep(1000);
 }
 eventWriteD.SetEvent();
 return 0;
}
UINT WriteD(LPVOID pParam)
{
 CEdit *pEdit=(CEdit*)pParam;
 pEdit->SetWindowText("");
 WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
 for(int i=0;i<10;i++)
 {
  g_Array[i]=''D'';
      pEdit->SetWindowText(g_Array);
  Sleep(1000);
 }
 return 0;
}
  仔細分析這兩個(gè)線(xiàn)程函數, 您就會(huì )正確理解CEvent 類(lèi)。線(xiàn)程WriteD執行到 WaitForSingleObject(eventWriteD.m_hObject,INFINITE);處等待,直到事件eventWriteD為有信號該線(xiàn)程才往下執行,因為eventWriteD對象是自動(dòng)事件,則當WaitForSingleObject()返回時(shí),系統自動(dòng)把eventWriteD對象重置為無(wú)信號狀態(tài)。
雙擊按鈕IDC_WRITEW,添加其響應函數:
void CMultiThread9Dlg::OnWritew()
{
 CWinThread *pWriteW=AfxBeginThread(WriteW,
  &m_ctrlW,
  THREAD_PRIORITY_NORMAL,
  0,
  CREATE_SUSPENDED);
 pWriteW->ResumeThread();
 CWinThread *pWriteD=AfxBeginThread(WriteD,
  &m_ctrlD,
  THREAD_PRIORITY_NORMAL,
  0,
  CREATE_SUSPENDED);
 pWriteD->ResumeThread();
 
}編譯并運行程序,單擊“寫(xiě)‘W’”按鈕,體會(huì )事件對象的作用。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
c中WaitForSingleObject函數解析(1)
CEvent類(lèi)及常用函數
WaitForSingleObject的用法--小浪的博客
多線(xiàn)程編程四
啟動(dòng)外部程序并等待它結束
VC知識庫文章 - 學(xué)習多線(xiàn)程之一:線(xiàn)程通信--利用事件對象
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久