进度条不会移动

时间:2016-10-20 13:50:50

标签: c++ windows mfc

我需要这样的逻辑:

ShowProgressBar();

Sleep(1000); //---> do here some work 

HideProgressBar();

MessageBoxW(_T("Wait"), _T("Title"), MB_OK);

ShowProgressBar();

Sleep(1000); //---> do here some work

HideProgressBar();

我在单独的线程(不是主GUI线程)中调用此代码。我得到了正常的对话窗口,但它的进度条被固定了:

enter image description here

然后:

enter image description here

然后: enter image description here

这是ShowProgressBar函数:

progressBarWindow = new Progress(this);

if (!progressBarWindow->Create(IDD_PROGRESSBAR, this))
{
    AfxMessageBox(TEXT("BAD PROGRESS BAR"));
    return;
}
if(!progressBarWindow->ShowWindow(SW_SHOWNA))
{
    AfxMessageBox(TEXT("BAD PROGRESS BAR"));
    return;
}   

this->BeginModalState();

这是HideProgressBar实现:

progressBarWindow->EndDialog(0);
this->EndModalState();

进度 - 是一类进度条对话框窗口。它绝对是标准的,具有带有品牌设置的进度条元素:

m_ProgressBar.SetMarquee(TRUE, 10) 
OnInitDialog函数中的

1 个答案:

答案 0 :(得分:2)

Windows具有线程关联性。

您在后台线程上调用progressBarWindow-> Create()。进度条现在位于后台线程中,并期望线程有一个消息泵。

它的父窗口属于另一个线程没关系,Windows可以做多线程GUI。但是你不行。你正在睡眠(1000),所以线程不处理Windows消息。我认为这就是为什么你的应用程序中没有GUI更新的原因。

对于大多数应用程序,正确的线程方式 - 在主线程中执行所有GUI。即使是与后台线程逻辑相关的进度条仍应在主GUI线程中创建。

要修复,请在主GUI线程中创建所有GUI,并仅使用单独的线程进行计算,IO或其他任何工作。

P.S。如果您的下一个问题是“但是当我的后台线程需要更改进度或完成其工作时如何通知GUI线程?” - 一种方法是自定义Windows消息。

例如,您可以在线程完成处理时将WM_USER + 11发送到某个窗口(例如发送到“进度”对话框),并在线程需要更新进度条位置时发送WM_USER + 12,传递进度在lParam或wParam中的位置。消息处理程序将在主线程中调用,您可以在其中更新进度,或关闭进度弹出窗口,或对GUI执行任何其他操作。