Ярлык не обновляется в строке состояния с индикатором выполнения

1

Я разрабатываю приложение Windows Forms в vС# express 2013. У меня есть элемент управления statstrip, где у меня есть метка и индикатор выполнения. Я хочу показать прогресс progressbar в метке, но он не обновляется со значением индикатора выполнения. он обновляется только тогда, когда индикатор выполнения завершен, т.е. когда значение равно 100, и задание завершено. Странно, что индикатор прогресса обновлен, но ярлык не... Любые идеи, что может происходить здесь? Кстати, я поднимаю событие прогресса в своем собственном коде, который обрабатывается, и прогресс соответственно обновляется... Спасибо

Я поднимаю событие ProgressTick в классе MGFDataHandler

if ((hundredthValue*progressMultiplier == lineCounter) || (lineCounter==totalLines))
            {
                //Raise the progress bar event!
                EventHandler handler = ProgressTick;                                        
                if (handler != null)
                {
                    handler(this, e);
                }
                progressMultiplier++;
            }

Затем я обрабатываю его в windowsform следующим образом:

void msDataHandler_ProgressTick(object sender, EventArgs e)
    {
        var progress = (int)((MGFDataHandler)sender).progressMultiplier;            
        if (progress < 100)
        {
            this.progressStatusString.Text = "Progress: " + progress + "%";                
            this.progressBar.Visible = true;
            this.progressBar.Value = progress;
        }            
        else 
        {
            this.progressStatusString.Text = "Done";
            this.filterMSDataToolStripMenuItem.Enabled = true;                
        }
    }

Функция, которая запускает все это, находится в событии windowsform_activated, а объект MGFDataHandler - это атрибут окна.

private void GlycoMSPipelineMainFrame_Activated(object sender, EventArgs e)
    {
        switch (this.whoActivatedMe)
        {
            case WhoActivatedMe.MSFilterWizard:
                {
                    this.whoActivatedMe = WhoActivatedMe.Me;
                    foreach (String currentmgffilename in this.currentMGFFileNames)
                    {
                        mgfDataHandler.Filter_MS_Data(currentmgffilename);
                    }                        
                    this.populateTreeViews();
                    break;
                }
            default:
                {
                    break;
                }
        }
    }

Это событие Filter_MS_Data вызывает событие.

  • 2
    покажите нам код и дополнительную информацию, пожалуйста
  • 0
    Я оставил тебе ответ. Это помогает? Вам нужна дополнительная информация?
Теги:
winforms
progress-bar

2 ответа

0

Мне нужна дополнительная информация для полного ответа, но направление, в которое это направляется, мне совершенно понятно.

Проблема в том, что вы, вероятно, все делаете в одном потоке. Когда у вас есть большая работа, вам нужно использовать фоновый поток для выполнения работы, и пусть основной поток (т.е. поток пользовательского интерфейса) обрабатывает пользовательский интерфейс.

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

Ссылки, которые вы должны прочитать:

  • 0
    Вы просто приняли участие в моем ответе и подробно остановились на нем! ба
  • 0
    Спасибо за ответ. Я действительно делаю все это в одном потоке, и я подозреваю, что это может происходить, но тогда возникает вопрос: почему ProgressBar.value может обновлять графический интерфейс, а не label.text? Прошло много времени с тех пор, как я профессионально занимался многопоточностью ... но попробую, если вы, ребята, уверены, что проблема здесь ...
Показать ещё 3 комментария
0

Попробуйте использовать фонового работника (найденного в System.componentModel) для выполнения выполняемой задачи. При обновлении метки или прогрессе вам нужно будет проверить, требуется ли invoke.

Что-то вроде этого.

If (label.InvokeRequired) { 
label.Invoke(new MethodInvoker(delegate
 { 
label.Text = progress.Value;
 });
}

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

Простите форматирование, которое я напечатал на своем телефоне.

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню