进度条在没有调试器的情况下运行时"卡住"

ProgressBar gets 'stuck' when running without debugger

本文关键字:情况下 运行时 调试器 卡住      更新时间:2023-10-16

我正在开发一个Visual c++应用程序,其中一部分是对文件进行拆包,因为这可能需要一段时间,所以我实现了一个进度条来反映拆包的进度。

这在调试器运行时很好,但是当我没有调试器或从.exe文件运行时,进度条始终停留在中途(尽管程序完成其功能很好),然后跳转到100%。

通过打印进度条的值,我发现该值被正确设置,但由于某种原因,这没有在视觉上反映出来。

进度条更新的代码是
while (mpeg.GetProgress() < 99){
            Console::Write(this->progressBar->Value);
            this->progressBar->Value = mpeg.GetProgress();
            this->progressBar->Update();
            Sleep(100);
        }

这是在程序主线程中完成的。休眠可以阻止它更新得太快,否则在控制台中就无法跟上。

需要跟踪的函数是mpeg.Depackitise(),这是在一个单独的线程中运行,以便进度条可以不断更新,关于'progress'变量的代码是:

double Mpeg::GetProgress() {
return Mpeg::progress;
}
void Mpeg::SetProgress(double prog) {
Mpeg::progress = prog;
}

下面的代码是一个for循环,它一个包一个包地遍历整个文件。'packet'变量是当前的数据包,'packet_count'是文件中的数据包总数,这些都是在单独的mpeg.Depackitise()线程中完成的。

        double Percent = 0.0;
    Percent = ((double)packet / (double)packet_count);
    SetProgress(Percent * 100);

如果有人可以建议一些解决方案来尝试,我将不胜感激,这已经困扰了我一段时间了。我在网上找到的一些建议说,使用未初始化的变量可能会导致有/没有调试运行之间的差异,但是我找不到任何未初始化的相关变量。

永远不要阻塞UI线程。

你正在应用程序的主线程中进行大量的计算,这意味着它无法响应消息泵并在屏幕上绘制/更新控件的绘图。

你应该研究多线程和消息传递来解决你的问题。启动一个线程,在那里做耗时的工作,使用回调来更新主线程的进度条(注意不要从主线程以外的任何地方直接访问UI !)