进度条在没有调试器的情况下运行时"卡住"
ProgressBar gets 'stuck' when running without debugger
我正在开发一个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 !)
相关文章:
- 这个c++代码是如何在没有定义函数的情况下运行的
- 如果程序在没有 sudo 的情况下运行,gtk_init会导致 ubuntu 16.04 崩溃
- 如何在不闪烁的情况下运行ESP32的单元测试
- 如何在-fsanitize=地址下运行时抑制泄漏清理器报告?
- 我在发布模式下运行时收到"Access violation reading location"错误 - C++
- Qt qml - 在没有任何条件的情况下运行一行(while(true))
- while 循环是否在设置标志的情况下运行多次?
- 如果在不需要的情况下运行语句
- VS Code - 如何在不再次构建的情况下运行未更改的 c++ 文件
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?
- 我们可以在没有安装工具包的情况下运行CUDA加速程序
- opengl调用可以在没有GPU的情况下运行吗
- 在没有.NET框架的情况下运行.NET EXE应用程序
- 如何在不打开代码::块的情况下运行 c++ 程序
- 在没有-DNDEBUG和-O3的情况下编译时,标准库实现不使用断言有什么原因吗
- 在没有系统调用的情况下运行sed
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- OpenGL错误只在未经调试的情况下运行时出现,怎么可能呢
- 当运行long-for循环的小部件(QDialog)在没有多线程的情况下关闭时,我如何停止它
- 进度条在没有调试器的情况下运行时"卡住"