gpt4 book ai didi

c++ - 进度条不动

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:37 25 4
gpt4 key购买 nike

我需要这样的逻辑:

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();

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

m_ProgressBar.SetMarquee(TRUE, 10) 

在 OnInitDialog 函数中

最佳答案

Windows 具有线程亲和性。

您正在后台线程上调用 progressBarWindow->Create()。进度条现在存在于您的后台线程中,并期望该线程具有消息泵。

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

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

要解决此问题,请在主 GUI 线程中创建所有 GUI,并且仅将单独的线程用于计算、IO 或任何其他工作。

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

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

关于c++ - 进度条不动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40156404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com