C #, winform - прогресс вращающегося колеса прерывается и возобновляется с перерывами - PullRequest
1 голос
/ 16 марта 2012

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

Но проблема в том, что колесо замирает и возобновляется, что происходит многократно в течение длительного процесса.Это должно быть непрерывное вращение.Я запускаю и задачу, и анимированный GIF-файл в одном потоке (, поскольку индикатор представляет собой просто анимированное изображение, а не реальное значение прогресса ).

Используемый код:

        this.progressPictureBox.Visible = true;
        this.Refresh(); // this - an user controll
        this.progressPictureBox.Refresh();
        Application.DoEvents();
        OnStartCalibration(); // Starts long running process
        this.progressPictureBox.Visible = false;

   OnStartCalibration()
   {      

        int count = 6;  
        int sleepInterval = 5000;
        bool success = false;
        for (int i = 0; i < count; i++)
        {
            Application.DoEvents();
            m_keywordList.Clear();
            m_keywordList.Add("HeatCoolModeStatus");
            m_role.ReadValueForKeys(m_keywordList, null, null);
            l_currentValue = (int)m_role.GetValue("HeatCoolModeStatus");
            if (l_currentValue == 16)
            {
                success = true;
                break;
            }    
            System.Threading.Thread.Sleep(sleepInterval);
        }
}

Как отобразить непрерывное непрерывное отображение колеса до завершения процесса?

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Если вы используете каркас 4, замените строку OnStartCalibration(); // Starts long running process следующим кодом:

BackgroundWorker bgwLoading = new BackgroundWorker();
bgwLoading.DoWork += (sndr, evnt) =>
{
    int count = 6;  
    int sleepInterval = 5000;
    bool success = false;
    for (int i = 0; i < count; i++)
    {
        Application.DoEvents();
        m_keywordList.Clear();
        m_keywordList.Add("HeatCoolModeStatus");
        m_role.ReadValueForKeys(m_keywordList, null, null);
        l_currentValue = (int)m_role.GetValue("HeatCoolModeStatus");
        if (l_currentValue == 16)
        {
            success = true;
            break;
        }    
        System.Threading.Thread.Sleep(sleepInterval);
    }
};
bgwLoading.RunWorkerAsync();
0 голосов
/ 16 марта 2012

Вы не можете запустить индикатор прогресса и задачу в одном потоке. Вы должны использовать BackgroundWorker

Ваш поток GUI подпишется на событие ProgressChanged и будет уведомлен об обновлениях задачи. Отсюда вы можете соответствующим образом обновить индикацию прогресса. Там также есть события, когда задача завершена.

...