Окна C # образуют индикатор выполнения с функцией фонового рабочего - PullRequest
0 голосов
/ 29 июля 2011

Я пытаюсь добавить индикатор выполнения (стиль MARQUEE) в мою надстройку c # excel. Индикатор выполнения отображается, но не показывает никакого прогресса до завершения выполнения функции, то есть он остается замороженным.

Это функции в классе Windows Form:

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(100);

            //run in back thread
            backgroundWorker1.ReportProgress(i); 
        }
    }

    //call back method
    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    //call back method
    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    {
        progressBar1.Value = progressBar1.Maximum;
    }

Вот как я вызываю функцию с помощью кнопки добавления:

    private void buttonClicked(object sender, RibbonControlEventArgs e)
    {
        AddInPlanView.Form1 pBar = new AddInPlanView.Form1();
        pBar.Visible = true;
        pBar.backgroundWorker1.WorkerReportsProgress = true;
        pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged);
        pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork);
        pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted);
        pBar.backgroundWorker1.RunWorkerAsync();

        FUNCTIONTORUN();

        pBar.Visible = false;
    }

Мой код теперь пытается поместить индикатор выполнения на фонового рабочего. Я знаю, что должен переключить это так, чтобы FUNCTIONTORUN() был на фоновом работнике, но как мне это сделать? Так как это индикатор выполнения, мне вообще не нужно обновлять значение индикатора выполнения, он просто должен работать до конца FUNCTIONTORUN(). Обратите внимание, что FUNCTIONTORUN() обновляет ячейки листа Excel.

Индикатор выполнения инициализируется с помощью дизайнера Visual Studio. Имя объекта ProgressBar в классе формы: progressbar1.

Ответы [ 6 ]

1 голос
/ 29 июля 2011
FUNCTIONTORUN(); // make your UI thread busy. 

System.Windows.Forms.Application.DoEvents(); // might help in this case.

В большинстве случаев такого рода DoEvent не помогает (согласно моему опыту). Таким образом, довольно трудно заставить панель процессов работать плавно.

1 голос
/ 29 июля 2011

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

progressbar1.Style = ProgressBarStyle.Marquee;

progressbar1.MarqueeAnimationSpeed = 100;

, чтобы остановить тип выделения

progressbar1.MarqueeAnimationSpeed= 0;

Источник: http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9e51ad57-988e-4c17-98f0-cd2a8abec503/

0 голосов
/ 29 июля 2011

Вы можете создать дополнительного фонового работника с DoWork, который содержит вызов функции FUNCTIONTORUN () внутри него и RunWorkerCompleted, который делает ваш бар остановленным или невидимым.Затем, вместо вызова FUNCTIONTORUN (), вызовите backGroundWorker2.RunWorkerAsync ();

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

0 голосов
/ 29 июля 2011

Я полагаю, что вы должны поместить FUNCTIONTORUN () в отдельный поток, и все равно это вызов выполнения ReportProgress , чтобы вызвать backgroundWorker1_ProgressChanged, где вы можете обновить значение панели porgress.Я предполагаю, что, поскольку я не вижу этого в предоставленном коде, вы не вызываете ReportProgress функцию где-то в коде.

EDITED : функция пилы ReportProgress.

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

Надеюсь, это поможет.

С уважением.

0 голосов
/ 29 июля 2011

Ваш FUNCTIONTORUN() блокирует поток пользовательского интерфейса.
Распространение некоторого System.Windows.Forms.Application.DoEvents() внутри ваших долгосрочных функций для обработки событий (таким образом, пользовательский интерфейс обновляется).
Это, как уже упоминалось, обновит пользовательский интерфейс и позволитприложение реагирует на другие события.
Возможно, вы захотите отключить кнопку, которая запускает эту долговременную функцию или другие долго работающие функции.

0 голосов
/ 29 июля 2011

Когда фоновый работник завершит работу, просто остановите индикатор выполнения.

Внутри этой функции pBar.backgroundWorker1_RunWorkerCompleted просто вызовите функцию Stop для индикатора выполнения.

...