control.invoke () проблема - PullRequest
       3

control.invoke () проблема

0 голосов
/ 09 марта 2012

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

Следующий код выполняется потоком не-GUI и используется для вызова события.

    protected virtual void OnUpdateProgressBar(object sender, ProgressBarEventArgs e)
    {
        EventHandler<ProgressBarEventArgs> TempHandler = UpdateProgressBar;

        //Avoid possible race condition.
        if (TempHandler != null)
        {
            TempHandler(this, e);
        }
    }

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

public class ProgressBarChanged
{
    ProgressBar statusBar;

    public ProgressBarChanged(ProgressBar pb)
    {
        statusBar = pb;
        statusBar.Value = 0;
    }
    public ProgressBarChanged()
    {
    }

    public void subscribeToEvent(DataVerification test)
    {
        test.UpdateProgressBar += new EventHandler<ProgressBarEventArgs>(incrementPB);
    }

    public void incrementPB(object sender, ProgressBarEventArgs e)
    {
        Action action = () =>
        {
            if (e.CurrentRow == e.FinalRow - 10)
            {
                int i = 5;
            }
            statusBar.Maximum = e.FinalRow;
            statusBar.Value = e.CurrentRow;
        };

        if(statusBar.InvokeRequired)
           statusBar.Invoke(action);
        else
            action();
    }
}

Я загрузил снимок экрана, показывающий индикатор выполнения и фактические значения. Есть идеи ???

Спасибо

enter image description here

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Progessbar - это простая обратная связь с пользователем, а не точный инструментарий.Это соска

Он также включает собственную асинхронную логику для обновления экрана (независимо от цикла сообщений).Это делает его немного позади.

Что в этом такого?

Чтобы получить более точные результаты, разделите ваш диапазон на <100 сегментов и делайте меньше обновлений.</p>

0 голосов
/ 09 марта 2012

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

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