mfc在多线程中更新进度条进度
时间: 2023-10-30 21:05:58 浏览: 160
在 MFC 中,更新进度条通常需要在 UI 线程中执行,但如果更新操作需要耗费大量时间,为了避免阻塞 UI 线程,可以在新的线程中执行更新操作,并通过消息机制通知 UI 线程更新进度条。
以下是一个更新进度条的示例代码:
```C++
// 新线程中执行的函数
UINT MyThreadProc(LPVOID pParam)
{
CProgressCtrl* pProgressCtrl = (CProgressCtrl*)pParam;
for (int i = 0; i < 100; i++)
{
// 更新进度条的位置
::PostMessage(pProgressCtrl->GetSafeHwnd(), PBM_SETPOS, i, 0);
// 等待一段时间,模拟长时间操作
Sleep(100);
}
return 0;
}
// 在 UI 线程中创建进度条和新线程
void CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 创建进度条控件
m_ProgressCtrl.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, CRect(10, 10, 200, 20), this, IDC_PROGRESS);
// 创建新线程
AfxBeginThread(MyThreadProc, &m_ProgressCtrl);
}
```
在新线程中,我们使用 `::PostMessage()` 函数向 UI 线程发送消息,更新进度条的位置。在 UI 线程中,我们收到这个消息后,调用进度条的 `PBM_SETPOS` 消息更新进度条的位置。
注意,如果在新线程中直接调用进度条的 `SetPos()` 函数更新进度条的位置,会导致程序崩溃或出现不可预料的错误,因为 UI 线程和新线程是不同的线程,不能直接访问对方的 UI 控件。
阅读全文