ProgressBar зависает при работе без отладчика - PullRequest
0 голосов
/ 21 октября 2011

Я работаю над приложением 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);

Если кто-то может предложитьНекоторые решения, чтобы попробовать это было бы высоко ценится, это уже давно меня раздражало.В некоторых предложениях, которые я нашел в Интернете, говорилось, что использование неинициализированных переменных может привести к различиям между запуском с / без отладки, однако я не могу найти релевантные переменные, которые не были инициализированы.

1 Ответ

3 голосов
/ 21 октября 2011

Вы никогда не должны блокировать поток пользовательского интерфейса.

Вы делаете обширные вычисления в главном потоке вашего приложения, что означает, что он не может ответить на насос сообщений и нарисовать / обновить чертежи элементов управления на экране.посмотрите на многопоточность и передачу сообщений как решение вашего вопроса.Запустите поток, сделайте там трудоемкую работу, используйте функцию обратного вызова, чтобы обновить индикатор выполнения основного потока (и остерегайтесь прямого доступа к интерфейсу пользователя из чего-либо, кроме основного потока!).

...