Метка и индикатор выполнения - PullRequest
2 голосов
/ 28 июня 2010

Мое приложение - это приложение на C # Windows. Когда пользователь нажимает кнопку «Создать», мое приложение создает новый поток и запускает новый процесс, процесс идет примерно так: псевдокод ниже

Loop counter = 1 to N 
    progressbar = counter/N
    Display msg on label1
    Do some tasks
Loop
progressbar = 100%
Display msg on lable1

Я делегировал свои сообщения панели процессов и метки, сообщения появляются, когда он находится внутри цикла без проблем. Я даже добавил событие для запуска Application.DoEvents () всякий раз, когда изменяется текст метки, однако мое последнее сообщение НИКОГДА показывает, что я пытался разместить Application.DoEvents () сразу после последней метки сообщения, но решения не найдено. Кто-нибудь еще сталкивался с этим раньше?

Спасибо за помощь всем!

Редактировать

Вот как я закодировал мою последнюю MSG (та, что после цикла)

        this.BeginInvoke((MethodInvoker)delegate()
        {
            toolStripProgressBar1.Value = 100;
            btnCancel.Enabled = false;
            btnBrowse.Enabled = true;
            btnSaveTo.Enabled = true;
            btnGenerate.Enabled = false;
            // Performance testing
            lblGeneratingInfo.Text = "Generation Complete! Total Run time: " + DateTime.Now.Subtract(startDate).ToString();
        });

ИСПРАВЛЕНО: Я предполагаю, что текст, который я пытался отобразить, был слишком длинным ... когда я заменил «Генерация завершена: общее время выполнения» просто «Время выполнения:», он отображал o_o

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Возможно, вы захотите использовать BackgroundWorker, который использует ReportProgress (), чтобы сообщить, насколько прогресс достигнут.

Посмотрите на это backgroundWorker Tutorial

Обновление интерфейса должно только происходить в методе, вызываемом ReportProgress ().

1 голос
/ 28 июня 2010

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

Вы должны попросить пользовательский интерфейс обновить себя в потоке пользовательского интерфейса - тогда вам не нужно DoEvents:

/* on worker thread */
string text = ...
int progress = ...
this.Invoke((MethodInvoker)delegate { /* on UI thread */
    label1.Text = text;
    progressBar.Value = progress;
});
/* on worker thread */
...