mfc 应用程序中WaitForMultipleObjects 监控3个事件并不影响主线程ui使用的完整示例demo
时间: 2024-12-08 08:15:13 浏览: 47
在MFC(Microsoft Foundation Classes)应用程序中,`WaitForMultipleObjects`函数通常用于线程同步,确保主线程不会因为等待其他线程完成任务而阻塞,这样可以保持用户界面(UI)的响应性。下面是一个简单的示例,演示如何在一个线程中监控三个事件,并在所有事件都发生后更新UI:
```cpp
#include "stdafx.h"
#include <windows.h>
#include "afxmt.h" // 引入MFC的线程管理头文件
// 假设我们有三个CEvent对象: hEvent1, hEvent2, 和hEvent3
CWinThread* pThread = NULL;
HHANDLE handles[] = { hEvent1, hEvent2, hEvent3 };
int eventCount = sizeof(handles) / sizeof(HANDLE);
LRESULT CALLBACK WorkerThreadProc(UPARAM_PTR param)
{
MSG msg;
bool allEventsSet = true;
for (int i = 0; i < eventCount; ++i)
{
DWORD result = WaitForMultipleObjects(eventCount, handles, FALSE, INFINITE);
if (result == WAIT_OBJECT_0 + i)
{
// 当前事件已触发,做相应操作...
SetDlgItemText(pDX, IDC_STATUS, L"Event " + std::to_wstring(i+1) + " has occurred");
allEventsSet = false;
}
else if (result != WAIT_TIMEOUT)
{
// 如果不是等待超时,说明有未预期的错误
MessageBox(NULL, L"Unexpected error waiting for events", L"Error", MB_OK | MB_ICONERROR);
break;
}
}
// 如果所有事件都触发了,更新UI显示
if (allEventsSet)
{
SetDlgItemText(pDX, IDC_STATUS, L"All events have occurred");
}
PostQuitMessage(0); // 退出线程
return 0;
}
BEGIN_MESSAGE_MAP(CYourFormClass, CDialogEx)
// ...其他的窗口消息映射...
ON_BN_CLICKED(IDC_TRIGGER_EVENT1, &CYourFormClass::OnBnClickedTriggerEvent1)
// ...按钮处理函数添加类似对事件2和3的触发...
END_MESSAGE_MAP()
void CYourFormClass::OnButtonTriggerAll()
{
// 创建新线程
pThread = AfxBeginThread(WorkerThreadProc, NULL);
if (!pThread)
{
// 线程创建失败,处理错误...
}
// 触发事件
SetEvent(hEvent1);
SetEvent(hEvent2);
SetEvent(hEvent3);
}
void CYourFormClass::OnDestroy()
{
if (pThread)
{
pThread->WaitForExit(); // 等待线程结束
pThread->Release(); // 释放资源
pThread = NULL;
}
CDialogEx::OnDestroy();
}
```
在这个例子中,当点击“触发所有事件”按钮时,会创建一个新的工作线程并调用`WorkerThreadProc`。主窗口UI线程继续运行,同时另一个线程监视事件。每个事件触发时,`WorkerThreadProc`会改变相应的UI元素。当所有事件都发生后,工作线程结束。
阅读全文
相关推荐


















