2013-03-04 2 views
1

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

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

+0

VCL запускает все формы на основной нити, если основной поток блокирует все блоки приложений. –

+0

@GregorBrandt: Спасибо. Таким образом, даже формы, созданные во вторичном потоке, по-прежнему связаны и управляются из основного потока? У вас есть ссылки на это? Почему VCL всегда должен быть другим;). – inquam

ответ

1

Не следует создавать формы в потоках, отличные от основного потока приложений, поскольку очередь сообщений Windows связана только с этим основным потоком.
Подумайте по-другому: убедитесь, что ваши формы всегда обновляются и реагируют, создают отдельные потоки для занятой работы, такие как обработка блокировки сообщений newtork и т. Д., А не для форм. В этом случае, после создания нового потока, основная форма продолжает откачивать сообщения из очереди, в то время как функция в разных потоках выполняет грязную работу, которая вам нужна. Когда рабочая нить заканчивается, она может сообщить основную нить о результатах, используя функцию PostMessage() WinAPI. Вы должны просто предоставить обработчики для таких пользовательских сообщений в своих формах, и они будут взаимодействовать с рабочими потоками без проблем.
Кроме того, если ваша «занятая работа» не очень сложна, вы можете даже обходиться без дополнительных потоков, запустив свою работу в потоке формы и время от времени вызывая функцию ProcessMessages(), чтобы обновить форму.

+0

Это для большого приложения уже на месте. Наличие формы, отображаемой и обновляемой без забот, если основной поток увяз, является быстрым способом исправить это. В противном случае нужно переписать много кода. Мне сказали, что это выполнимо и что новая форма может иметь собственный поток обработки сообщений. Использование для этого состоит в том, чтобы отображаемое (и анимированное) уведомление выполнялось, пока основной поток выполняет работу. – inquam

+0

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

+0

Ну, так как я хочу, чтобы «всплывающее окно» могло «заблокировать» главное окно, которое было бы немного неудобно. Странно, потому что это так просто в C#, например, и даже C++ MFC. http://stackoverflow.com/questions/3990857/running-a-windows-form-in-a-separate-thread – inquam

Смежные вопросы