Вынудите обновление GUI покинуть Поток UI

Я нашел решение, оно работает над моей системой (Gigabit Ethernet PCI Express RTL8111/8168B + Ubuntu 12.04 AMD64). Этот отчет об ошибках описывает проблему, и кто-то предположил, что использование r8168 модуля вместо r8169 модуля добьется цели. Также где-то в другом месте я видел, что это может быть сделано через dkms, но я спешу этим утром, не получил шанс посмотреть, это могло бы помочь

wget http://r8168.googlecode.com/files/r8168-8.030.00.tar.bz2
tar xjf r8168-8.030.00.tar.bz2
cd r8168-8.030.00
./autorun.sh

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

69
задан Bobby 3 June 2011 в 11:06
поделиться

6 ответов

Сначала я задался вопросом, почему OP еще не пометил один из ответов как ответ, но после того, как попробовал сам и все еще не работал, Я копнул немного глубже и обнаружил, что в этой проблеме гораздо больше, чем я предполагал вначале.

Лучшее понимание можно получить, прочитав аналогичный вопрос: Почему не удается контролировать обновление / обновление в середине процесса

Наконец, для записи, я смог обновить свой лейбл, выполнив следующее:

private void SetStatus(string status) 
{
    lblStatus.Text = status;
    lblStatus.Invalidate();
    lblStatus.Update();
    lblStatus.Refresh();
    Application.DoEvents();
}

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

94
ответ дан 24 November 2019 в 13:48
поделиться

Вызов label.Invalidate , а затем label.Update () - обычно обновление происходит только после выхода из текущей функции, но вызов Update заставляет его для обновления в этом конкретном месте кода. Из MSDN :

Метод Invalidate определяет, что окрашивается или перекрашивается. Когда происходит рисование или перерисовка, управляет метод Update. Если вы используете методы Invalidate и Update вместе, а не вызываете Refresh, то, что будет перерисовано, зависит от того, какую перегрузку Invalidate вы используете. Метод Update просто вызывает немедленную отрисовку элемента управления, но метод Invalidate определяет, что отрисовывается при вызове метода Update.

14
ответ дан 24 November 2019 в 13:48
поделиться

Очень заманчиво захотеть "исправить" это и принудительно обновить пользовательский интерфейс, но лучшее решение - сделать это в фоновом потоке, а не связывать поток пользовательского интерфейса, чтобы он все еще мог реагировать на события.

1
ответ дан 24 November 2019 в 13:48
поделиться

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

13
ответ дан 24 November 2019 в 13:48
поделиться
1
ответ дан 24 November 2019 в 13:48
поделиться

вы можете попробовать это

using System.Windows.Forms; // u need this to include.

MethodInvoker updateIt = delegate
                {
                    this.label1.Text = "Started...";
                };
this.label1.BeginInvoke(updateIt);

Посмотрите, работает ли это.

3
ответ дан 24 November 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: