Пытается обновить ProgressBar (без многопоточности) - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть программа (winform), которая проходит через множество файлов (в области 400 раз) в папке, и чтобы показать, как она работает, я использую индикатор выполнения.информация публикуется в виде списка, если это имеет значение.У меня проблема в том, что когда компьютер работает медленно, я работаю с папками по сети или если это действительно большое количество файлов, ProgressBar просто перестает обновляться.если n выйти из программы, она продолжится и закончится, но индикатор выполнения застревает на каком-то этапе.И затем только показывает, что это завершено (дополнительное примечание: я заметил, что это не просто индикатор выполнения. Иногда это целая форма. Но опять же, когда программа завершена, все в порядке. И пока она работает, вы можете перемещатьформа, просто не взаимодействовать с ней)

Теперь вот, где это становится сложным.Я знаю, что это можно решить с помощью потоков.мне, однако, сказали не использовать это (давайте не будем вдаваться в причину, давайте просто исключим это, глупо это или нет).Я также попытался обновить форму и обновить сам бар.похоже, ничего из этого не работает.это не очень хорошая идея, но даже попробовал. DoEvent, он также не работает

Как я могу получить индикатор выполнения для обновления?какие-нибудь идеи?

вот часть кода, который я использую для индикатора выполнения

//before the loop
progress = iCount1;
progressvalue = 0;
double increment = 100 / (double)progress;
//this is at the end of the loop
progressvalue = progressvalue + increment;

, тогда есть немного кода.некоторые из них, чтобы остановить выход значения за пределы.остальное вообще не связано с индикатором выполнения

edit: o, у меня есть эта 1 переменная.и это в основном проходит через 3 цикла.так что у нас есть один непрерывный бар.не бар, работающий 3 раза

edit: похоже, работает нормально для папки на моем компьютере.но когда он запускается на медленном компьютере или по сети, то именно тогда он делает это

РЕДАКТИРОВАТЬ: я получаю ответы о backgroundworker и потоках.так нет ли способа сделать это без потоков?

Обновление: я наконец убедил своего босса сделать это с backgroundworker.так плохо буду этим заниматься.но на этот вопрос, я думаю, ответ .DoEvent - лучший

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Когда нить формы занята, она очень не отвечает и вообще не рисует форму. Даже если вы не хотите заниматься потоками, я думаю, вам следует пересмотреть ..

Я бы использовал фонового работника, как в этом примере: здесь это довольно простая установка.

0 голосов
/ 16 февраля 2012

Вы можете добавить Application.DoEvents () затем.

Например:

while(!end)
{ 

            //You processing logic here
            Application.DoEvents();
}

Обратите внимание, что это обычно не рекомендуется, так как это нарушит нормальный поток событий и может иметьнепредвиденные результаты.

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx http://www.codinghorror.com/blog/2005/08/is-doevents-evil-revisited.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...