在没有调试器的情况下运行时,ProgressBar会“卡住”

时间:2011-10-21 14:24:33

标签: c++ multithreading visual-c++ progress-bar win32gui

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

这在使用调试器运行时工作正常,但是当我在没有调试器或.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);

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

1 个答案:

答案 0 :(得分:3)

您永远不会阻止UI线程。

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

您应该将多线程和消息传递视为问题的解决方案。启动一个线程,在那里完成耗时的工作,使用回调来更新主线程的进度条(并注意直接从主线程以外的任何东西访问UI!)。