Windows Forms - многократные циклы событий - PullRequest
7 голосов
/ 30 октября 2008

У меня есть приложение Windows Forms (.NET), в котором можно одновременно открывать несколько документов.

Было бы удобно, чтобы каждый документ (форма) выполнял свой собственный цикл событий. После коротких экспериментов кажется, что запуск нескольких циклов событий в их собственных потоках STA работает. Есть ли причина, почему это плохая идея?

Ответы [ 5 ]

4 голосов
/ 30 октября 2008

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

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

И, как говорил Кевин, остерегайтесь вызовов между окнами (между потоками). Вы можете использовать Control.BeginInvoke или Control.Invoke для публикации вызовов делегатов в других потоках пользовательского интерфейса.

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

1 голос
/ 30 октября 2008

Может быть разумнее использовать контейнер MDI (Multiple Document Interface) и дочерние формы. В этом случае каждый документ будет иметь свою собственную форму, что технически означает, что у каждого документа есть собственная очередь сообщений.

0 голосов
/ 30 октября 2008

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

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

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

0 голосов
/ 30 октября 2008

Немодальные формы могут быть более подходящими для ваших целей. Используйте form.Show () вместо form.ShowDialog ().

0 голосов
/ 30 октября 2008

Просто будьте осторожны с доступом к элементам графического интерфейса из потоков.

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