MFC子线程才做UI
时间: 2024-10-17 20:05:36 浏览: 35
在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考
MFC (Microsoft Foundation Classes) 是微软为其 Windows 应用程序开发提供的框架,它包括了 GUI (图形用户界面) 开发所需的许多类库。在MFC中,主线程(也称为消息循环线程)负责处理所有的用户交互操作,如窗口事件和控件更新等。为了防止主线程阻塞,处理耗时的操作(如网络请求、文件读写等),MFC 提供了一种机制:在子线程中执行此类任务。
在MFC中创建子线程并做UI操作的过程通常如下:
1. **创建子线程**:使用 `CWinThread` 的派生类(如 `CEditThread` 或自定义线程类)创建一个新的线程实例。
```cpp
CMyThread* pThread = new CMyThread;
pThread->Create();
```
2. **定义工作函数**:在子线程中,你需要编写一个成员函数作为线程的工作函数,这个函数将在子线程中运行。在这里,你可以处理非UI相关的操作。
```cpp
virtual void Run()
{
// 执行你的耗时任务...
}
```
3. **同步UI更新**:由于在子线程中修改UI会引发竞态条件,你需要使用 MFC 提供的 `afxBEGIN_MESSAGE_MAP()` 和 `afxEND_MESSAGE_MAP()` 来确保UI操作在主线程的消息循环中安全地进行。例如,你可以使用 `PostMessage` 将结果传递回主线程更新UI。
```cpp
void OnTaskFinished()
{
// 更新UI或显示结果
m_editCtrl.SetText(result);
InvalidateRect(m_editCtrl.GetSafeHwnd(), NULL, TRUE);
}
void MyWorkerMethod()
{
// ...
// 当任务完成后,通知主线程更新UI
AfxBeginMessageMap(CMyThread, IDC_MYTHREAD);
ON_MESSAGE(WM_THREAD_FINISHED, OnTaskFinished);
AfxEndMessageMap();
// 其他UI无关的操作...
}
```
4. **终止子线程**:当不再需要线程时,可以通过 `TerminateDialog` 或 `PostQuitMessage` 结束子线程。
```cpp
void OnDestroy()
{
if (m_pThread)
{
// 请求结束线程
TerminateThread(m_pThread->m_hThread, 0);
}
CWinThread::OnDestroy();
}
```
阅读全文