首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Windows 95 多執行緒同步控制:Event 物件實作詳解

     編輯:VC 教學

前言:Win95 執行緒模型基礎

Windows 95 採用預先多任務架構,每個應用程式即一個進程,進程可建立多個執行緒並發執行。執行緒是系統排程的基本單位,以函數形式存在,共享進程的全域變數、檔案控制表等資源。主執行緒類似 Unix 父進程,子執行緒類似子進程。為了讓使用者能有效控制(暫停、終止、改變條件)獨立運行的執行緒,必須引入同步機制——Event 物件是核心選擇之一。

執行緒建立:CreateThread API

HANDLE hThread = CreateThread(
    NULL,                // 安全屬性(Win95 忽略)
    0,                   // 預設堆疊大小
    &TEventWindow::ThreadFunc, // 執行緒入口函數
    this,                // 傳遞 this 指標
    0,                   // 立即運行
    &hThreadId           // 接收執行緒 ID
);

入口函數簽名:DWORD WINAPI ThreadFunc(LPVOID lpParam)。參數 lpParam 傳遞 this,內部轉型後呼叫具體業務函數 LoopFunc()。

Event 物件同步機制

核心 API

  • CreateEvent:建立手動/自動重置、初始狀態、具名/匿名 Event。
  • SetEvent / ResetEvent:觸發/重置信號狀態。
  • WaitForSingleObject / WaitForMultipleObjects:阻塞等待信號。

典型同步模式

模式Event 類型適用場景
單次觸發通知自動重置工作完成通知主執行緒
廣播通知手動重置多執行緒等待同一啟動信號
互斥存取配合 CriticalSection保護共享資源

跨進程同步:具名 Event

不同應用程式間同步,只需在 CreateEvent 指定相同名稱:

HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "Global\\MyAppSyncEvent");
// 進程 A:SetEvent(hEvent);
// 進程 B:WaitForSingleObject(hEvent, INFINITE);

前綴 Global\\ 確保跨會話可見(Terminal Services 環境下關鍵)。

完整範例架構

  1. 主視窗類別持有 HANDLE hEvent 與 HANDLE hThread。
  2. 按鈕「啟動」→ CreateThread + CreateEvent。
  3. 工作執行緒定期檢查 WaitForSingleObject(hStopEvent, 0) 實現優雅退出。
  4. 按鈕「停止」→ SetEvent(hStopEvent) → WaitForSingleObject(hThread, INFINITE) 回收。

最佳實踐提醒

  • 務必在執行緒函數返回前 CloseHandle(hEvent) 避免洩漏。
  • 避免在 UI 執行緒長時間 WaitForSingleObject(INFINITE) 導致介面凍結;改用 MsgWaitForMultipleObjects 配合訊息泵。
  • 跨進程同步時,考慮安全性描述子防止未授權存取。

執行緒 Event 同步時序圖

掌握 Event 物件,即掌握了 Win32 多執行緒協作的核心鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved