程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 線程通信--利用事件對象

線程通信--利用事件對象

編輯:關於VC++

在線程之間傳送信號可以使用事件對象,用MFC的CEvent來表示。一個事件對象有兩種狀態:信號態與非信號態。線程能監視於信號態的事件,以便在適當的時間完成對事件的操作。

創建事件的語句如下:

CEvent ThreadBegin;

事件被創建後就自動處於非信號態,要使用它處於信息態,必須使用對件對象的成員函數SetEvent(),即:

ThreadBegin.SetEvent();

線程監視這個信號來知道事件已准備就緒,從而可以進行其它的操作。而線程通過調用API函數WaitForSingleObject()來監視這個信號。

::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);

該函數的兩個參數分別表示要檢查的事件句柄與函數等待事件時間。

INFINITE告訴WaitForSingleObject()在特定的事件不處於信號態時不要返回,即把它放在線程的開始的話,那麼系統將掛起這個線程,直到事件處於信號態時才繼續執行下去。當已經准備好線程繼續執行下去的條件時,調用SetEvent(),當線程獲得了相應信號態信號後便會繼續執行下去。

一旦線程不再被掛起時,它便可以完成相關事務。但若要在主程序中通過線程結束,那麼線程必須監視接下來的這個事件,看它是否處於信號態。線程可以通過對事件進行輪詢,這時只要調用WaitForSingleObject()即可,只是等待時間參數的值被置為0,即:

::WaitForSingleObject(ThreadBegin.m_hObject,0);

當返回WAIT_OBJECT_0時,表示事件處於信號態,否則處於非信號態。

UINT ThreadProc(LPVOID param)
{
  ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);
  ::MessageBox((HWND)param,"Thread Activated!","Thread",MB_OK);
  BOOL KeepRunning=true;
  while (KeepRunning)
  {
    int Result=::WaitForSingleObject(ThreadEnd.m_hObject,0);
    if (Result==WAIT_OBJECT_0)
      KeepRunning=false;
  }
  ::MessageBox((HWND)param,"Thread Stopped!","Thread",MB_OK);
  return 0;
}

啟動線程則用如下代碼:

HWND hWnd=GetSafeHwnd();
AfxBeginThread(ThreadProc,hWnd);
ThreadBegin.SetEvent();

本文即本人在學習多任務多線程過程的手記,供大家參考,望能得到各位指點。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved