共用方式為


CEvent 類別

表示事件,是同步物件可讓執行緒向類別上的事件發生。

class CEvent : public CSyncObject

Members

efk30beh.collapse_all(zh-tw,VS.110).gif公用建構函式

名稱

描述

CEvent::CEvent

建構 CEvent 物件。

efk30beh.collapse_all(zh-tw,VS.110).gif公用方法

名稱

描述

CEvent::PulseEvent

將事件設定為可用 (信號) 版本,等候執行緒的和集合事件為無法使用 (非)。

CEvent::ResetEvent

將事件設定為無法使用 (非)。

CEvent::SetEvent

將事件加入至可用 (信號) 和釋放所有等候中的執行緒。

CEvent::Unlock

發行事件物件。

備註

指定執行緒時必須知道執行其工作時,事件會很有用處。 例如,複製至資料檔案的執行緒必須告知,當新資料可用時。 您可以使用告知複本的 CEvent 物件執行緒,新增資料可用,執行緒可以儘快執行其工作。

CEvent 具有兩種類型:手動和自動。

將自動 CEvent 物件自動復原為未收到信號的 (無法使用) 狀態,在釋放之後至少一個執行緒。 根據預設,在中,除非您在建構時,您可以 bManualReset 參數的 TRUECEvent 物件會自動進行。

方針 CEvent 物件在 SetEventResetEvent 設定的狀態會暫停,直到另一個函式呼叫。 若要建立手動 CEvent 物件,請在建構期間傳遞 bManualReset 參數的 TRUE 。

如果需要時,要使用 CEvent 物件,請 CEvent 建構物件。 指定要等候事件的名稱,並指定您的應用程式應初始擁有它。 當建構函式傳回時,您可以存取事件。 呼叫 SetEvent 信號 (可提供事件) 物件,然後呼叫 解除鎖定 在進行存取控制資源時。

替代方法是使用 CEvent 要加入物件的型別 CEvent 的變數時,您要將控制項的類別的資料成員。 控制在建構物件時,請呼叫 CEvent 資料成員的建構函式並指定事件是否一開始就會收到信號,因此的事件物件的 specifythe 型別時,事件的名稱 (如果它跨越處理序界限是使用) 和所有需要的安全性屬性。

若要存取 CEvent 物件做控制項的資源,請先建立型別 CSingleLock 的變數或輸入於資源存取方法的 CMultiLock 。 然後呼叫鎖定物件 (例如, CMultiLock::Lock) 的 Lock 方法。 此時,您的執行緒存取資源的存取權,會等候資源釋放並存取或等候資源釋放,時間和錯誤才能存取資源。 無論如何,您的資源存取以安全執行緒方法。 若要釋放資源,請呼叫 SetEvent 事件發出信號物件,然後使用鎖定物件的 Unlock 方法 (例如, CMultiLock::Unlock),或是讓鎖定物件落在範圍外。

如需如何使用 CEvent 物件的詳細資訊,請參閱 多執行緒:如何使用同步類別

範例

// The following demonstrates trivial usage of the CEvent class.
// A CEvent object is created and passed as a parameter to another 
// thread.  The other thread will wait for the event to be signaled
// and then exit

UINT __cdecl MyThreadProc(LPVOID lpParameter)
{
   CEvent* pEvent = (CEvent*)(lpParameter);
   VERIFY(pEvent != NULL);

   // Wait for the event to be signaled
   ::WaitForSingleObject(pEvent->m_hObject, INFINITE);

   // Terminate the thread
   ::AfxEndThread(0, FALSE); 
   return 0L;
}

void CEvent_Test()
{
   // Create the CEvent object that will be passed to the thread routine
   CEvent* pEvent = new CEvent(FALSE, FALSE);

   // Create a thread that will wait on the event
   CWinThread* pThread;
   pThread = ::AfxBeginThread(&MyThreadProc, pEvent, 0, 0, CREATE_SUSPENDED, NULL);
   pThread->m_bAutoDelete = FALSE; 
   pThread->ResumeThread();

   // Signal the thread to do the next work item
   pEvent->SetEvent();

   // Wait for the thread to consume the event and return
   ::WaitForSingleObject(pThread->m_hThread, INFINITE); 
   delete pThread;
   delete pEvent;
}
// This example builds upon the previous one.
// A second thread is created to calculate prime numbers.
// The main thread will signal the second thread to calulate the next 
// prime number in the series.  The second thread signals the first 
// after each number is calculated. Finally, after several iterations 
// the worker thread is signaled to terminate.

class CPrimeTest
{
public:
   CPrimeTest()
      : m_pCalcNext(new CEvent(FALSE, FALSE))
      , m_pCalcFinished(new CEvent(FALSE, FALSE))
      , m_pTerminateThread(new CEvent(FALSE, FALSE))
      , m_iCurrentPrime(0)
   {   
      // Create a thread that will calculate the prime numbers
      CWinThread* pThread;
      pThread = ::AfxBeginThread(&PrimeCalcProc, this, 0, 0, CREATE_SUSPENDED, NULL);
      pThread->m_bAutoDelete = FALSE; 
      pThread->ResumeThread();

      // Calcuate the first 10 prime numbers in the series on the thread
      for(UINT i = 0; i < 10; i++)
      {
         // Signal the thread to do the next work item
         m_pCalcNext->SetEvent();
         // Wait for the thread to complete the current task
         ::WaitForSingleObject(m_pCalcFinished->m_hObject, INFINITE);
         // Print the result
         TRACE(_T("The value of m_iCurrentPrime is: %d\n"), m_iCurrentPrime);
      }

      // Notify the worker thread to exit and wait for it to complete
      m_pTerminateThread->SetEvent();
      ::WaitForSingleObject(pThread->m_hThread, INFINITE); 
      delete pThread;
   }
   ~CPrimeTest()
   {
      delete m_pCalcNext;
      delete m_pCalcFinished;
      delete m_pTerminateThread;
   }

private:
   // Determines whether the given number is a prime number
   static BOOL IsPrime(INT ThisPrime)
   {
      if(ThisPrime < 2) 
         return FALSE;

      for(INT n = 2; n < ThisPrime; n++)
      {
         if(ThisPrime % n == 0)
            return FALSE;
      }
      return TRUE;
   }

   // Calculates the next prime number in the series
   static INT NextPrime(INT ThisPrime)
   {
      while(TRUE)
      {
         if(IsPrime(++ThisPrime))
         {
            return ThisPrime;
         }
      }
   }

   // Worker thread responsible for calculating the next prime
   // number in the series
   static UINT __cdecl PrimeCalcProc(LPVOID lpParameter)
   {
      CPrimeTest* pThis = static_cast<CPrimeTest*>(lpParameter);
      VERIFY(pThis != NULL);

      VERIFY(pThis->m_pCalcNext != NULL);
      VERIFY(pThis->m_pCalcFinished != NULL);
      VERIFY(pThis->m_pTerminateThread != NULL);

      // Create a CMultiLock object to wait on the various events
      // WAIT_OBJECT_0 refers to the first event in the array, WAIT_OBJECT_0+1 refers to the second
      CSyncObject* pWaitObjects[] = { pThis->m_pCalcNext, pThis->m_pTerminateThread };
      CMultiLock MultiLock(pWaitObjects, 2L);
      while(MultiLock.Lock(INFINITE, FALSE) == WAIT_OBJECT_0) 
      {         
         // Calculate next prime
         pThis->m_iCurrentPrime = NextPrime(pThis->m_iCurrentPrime);
         // Notify main thread calculation is complete
         pThis->m_pCalcFinished->SetEvent();
       } 

      // Terminate the thread
       ::AfxEndThread(0, FALSE); 
      return 0L;
   }

   CEvent* m_pCalcNext;      // notifies worker thread to calculate next prime
   CEvent* m_pCalcFinished;   // notifies main thread current calculation is complete
   CEvent* m_pTerminateThread;   // notifies worker thread to terminate

   INT m_iCurrentPrime;   // current calculated prime number
};

繼承階層架構

CObject

CSyncObject

CEvent

需求

Header: afxmt.h

請參閱

參考

CSyncObject 類別

階層架構圖