MFCのマルチスレッドプログレスバーに関する問題
MFCを使用してプログレスバーを実装する多重スレッドは、以下の手順で実現できます:
- MFCが提供するCProgressCtrlクラスを使用して、プログレスバーコントロールを作成します。
- CWinThreadを継承したカスタムスレッドクラスを作成し、その中のRunメソッドをオーバーライドします。Runメソッド内で、バックグラウンドで実行するタスクを実装し、適切なタイミングで進捗バーのコントロールを更新します。
- メインスレッドでカスタムスレッドクラスのインスタンスを作成し、それのCreateThreadメソッドを呼び出してスレッドを開始する。
- 進度バーを更新する必要がある場合は、カスタムメッセージをメインウインドウに送信して、メインスレッドに進度バーコントロールの値を更新するように通知します。
以下是具体的实现代码:
// 主线程代码
void CMyDialog::OnButtonStart()
{
// 创建进度条
m_progressBar.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, CRect(10, 10, 200, 30), this, IDC_PROGRESS_BAR);
// 创建自定义线程类的实例
m_thread = new CMyThread();
// 启动线程
m_thread->CreateThread();
// 注册自定义消息
m_progressBar.SetOwner(this);
m_progressBar.SetRange(0, 100);
}
// 自定义线程类
class CMyThread : public CWinThread
{
public:
BOOL InitInstance() override
{
// 后台任务
for (int i = 0; i <= 100; i++)
{
// 更新进度条
SendMessage(m_pMainWnd->m_hWnd, WM_MY_UPDATE_PROGRESS, i, 0);
// 模拟耗时操作
Sleep(100);
}
// 任务完成
PostMessage(m_pMainWnd->m_hWnd, WM_MY_TASK_COMPLETE, 0, 0);
return TRUE;
}
void ExitInstance() override
{
// 释放线程对象
delete this;
}
};
// 主窗口消息映射
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_MESSAGE(WM_MY_UPDATE_PROGRESS, OnUpdateProgress)
ON_MESSAGE(WM_MY_TASK_COMPLETE, OnTaskComplete)
END_MESSAGE_MAP()
// 更新进度条的消息处理函数
LRESULT CMyDialog::OnUpdateProgress(WPARAM wParam, LPARAM lParam)
{
int progress = static_cast<int>(wParam);
m_progressBar.SetPos(progress);
return 0;
}
// 任务完成的消息处理函数
LRESULT CMyDialog::OnTaskComplete(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(_T("任务完成"));
return 0;
}
上記は、マルチスレッドの進捗バーを実装する簡単な例です。実際のアプリケーションでは、スレッドの同期や例外処理なども考慮する必要があります。