我正在开发一个 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(),它在单独的线程中运行,以便可以不断更新进度条,有关“进度”变量的代码是:
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);
如果有人可以提出一些解决方案来尝试,将不胜感激,这已经让我烦恼了一段时间。我在网上找到的一些建议说,使用未初始化的变量可能会导致有/无调试运行之间的差异,但是我找不到任何未初始化的相关变量。