Народ, такой вопрос: в главном приложении подгружаю библиотеку с помощью Assembly.LoadFile, далее создаю инстанс класса из этой библиотеке, в данном классе создаю поток и в нем создаю форму, далее делаю Form.Show() и получаю зависшее окно, не реагирующее на сообщения и не отрисовывающее контролы, если же вызывать show для этой формы из главного потока, то все работает. В чем проблема?
Здравствуйте, Vetal1979, Вы писали:
V>Народ, такой вопрос: в главном приложении подгружаю библиотеку с помощью Assembly.LoadFile, далее создаю инстанс класса из этой библиотеке, в данном классе создаю поток и в нем создаю форму, далее делаю Form.Show() и получаю зависшее окно, не реагирующее на сообщения и не отрисовывающее контролы, если же вызывать show для этой формы из главного потока, то все работает. В чем проблема?
Базовое правило: весь GUI винформов должен быть в одном потоке. Почему — в гугл.
Думается, в новом потоке нет прокачки очереди сообщений.
Пример для размышлений:
for ( int i = 0; i < 10; ++i )
{
System.Threading.Thread t = new System.Threading.Thread( () =>
{
Form form = new Form();
//form.Show();
Application.Run( form ); //form.ShowDialog() - тоже работает
} );
t.IsBackground = true;
t.Start();
}
}
Здравствуйте, Aen Sidhe, Вы писали:
AS>Базовое правило: весь GUI винформов должен быть в одном потоке. Почему — в гугл.
вовсе нет
просто должен быть цикл обработки сообщений
Здравствуйте, agos, Вы писали:
A>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Базовое правило: весь GUI винформов должен быть в одном потоке. Почему — в гугл. A>вовсе нет A>просто должен быть цикл обработки сообщений
SingleThreadApartment тоже просто так при старте выставляется?
Здравствуйте, Aen Sidhe, Вы писали:
AS>SingleThreadApartment тоже просто так при старте выставляется?
Нет, не просто так.
Drag and Drop и, скорее всего, ещё какие-нибудь OLE заморочки требуют STA, и то, только тогда, когда их используют. Но при чем здесь это?
Здравствуйте, agos, Вы писали:
A>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Базовое правило: весь GUI винформов должен быть в одном потоке. Почему — в гугл. A>вовсе нет A>просто должен быть цикл обработки сообщений
А как организовать цикл обработки сообщений в новом потоке?
Re[4]: Форма в библиотеке
От:
Аноним
Дата:
27.08.09 19:24
Оценка:
Здравствуйте, Vetal1979, Вы писали:
V>А как организовать цикл обработки сообщений в новом потоке?
Можно руками (с помощью Win32), можно показать окошко как ShowModal, а можно вызвать Application.Run