Есть ли Application.DoEvents на уровне формы? - PullRequest
1 голос
/ 22 января 2010

В настоящее время у меня есть приложение, которое порождает несколько экземпляров одной формы выигрыша. Каждый экземпляр формы имеет таймер, который обновляет ряд элементов управления и некоторые свойства самой формы со скоростью около 1 тика / сек. Как только приложение достигает определенного числа форм, оно прекращает рисовать «обновления», которые происходят в пределах отметок таймера.

Я хочу держать поток пользовательского интерфейса в нижней части таймера и разрешить перерисовывать форму без вызова Application.DoEvents (насколько я понимаю, Application.DoEvents () обрабатывает все ожидающие сообщения окна через окно приложение (которое может включать другие метки таймеров? - не уверен), когда все, что я хочу, чтобы он обрабатывал, - это перерисовка формы теперь, когда обновлен ряд элементов управления).

Ответы [ 4 ]

5 голосов
/ 22 января 2010

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

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

5 голосов
/ 22 января 2010

Если вы просто хотите, чтобы форма или конкретный элемент управления перерисовывались, просто вызовите Control.Refresh в соответствующей форме / элементе управления.

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

3 голосов
/ 22 января 2010

Существует три категории сообщений Windows, которые отправляются с помощью цикла сообщений и вызова Application.DoEvents (). Сначала идут сообщения, которые отправляются с помощью SendMessage (). Они важны, их нужно отправлять сразу, потому что есть какая-то другая программа, ожидающая результата вызова SendMessage (). Они не помещаются в очередь сообщений, Windows напрямую вызывает оконную процедуру.

Тогда есть сообщения, которые помещаются в очередь сообщений с помощью PostMessage (). Они могут ждать, они просто уведомления. Все сообщения клавиатуры и мыши соответствуют этой категории.

Далее идут сообщения с низким приоритетом, WM_TIMER и WM_PAINT. Они отправляются только тогда, когда больше ничего не нужно делать, SendMessage не ожидает и очередь сообщений пуста.

Звучит так, будто вы оказались в ситуации, когда вы так сильно голодали Windows, что не могли больше отправлять эти сообщения с низким приоритетом. Вероятно, больше не получит ни таймеров, ни событий Paint. Вызов DoEvents только раз в секунду, безусловно, сделает это. Это плохо, ваша программа теперь влияет на работу других программ. Вы должны это исправить. Сделайте это, изменив архитектуру вашего приложения, чтобы вы больше не зависели от DoEvents.

0 голосов
/ 23 января 2010

Мой 2с:

Наличие таймера в каждой форме приведет к снижению производительности для сканирования. Каждое окно с каждым вторым интервалом будет запрашивать у приложения переключение в «контекст» этого окна и выполнение некоторого кода. Весь этот переключатель, вероятно, дольше, чем на самом деле требует ваш код. Соедините это с вероятным фактом, что все ваши формы находятся в одном и том же «контексте».

Вместо этого рассмотрите что-нибудь подобное, если это возможно:

List<MyForm> listofmyform;

Timer t = new Timer()
t.tick += delegate
{
    foreach(MyForm thisform in listofmyform)
        thisform.DoUpdate();
}

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

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