Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.214.230] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Мне нужно создать форму в отдельном потоке и делать ProcessMessage в цикле.
Сталкиваюсь с кучей проблем: если создавать форму через TThread.Synchronize, то в главном потоке нужно сделать Application.ProcessMessages, чтобы этот Synchronize сработал. Если делать без Synchronize, то идёт завис на TForm.Show. Но это ещё ладно, это решаемо. Основная проблема в том, что я не могу делать Application.ProcessMessages из нового потока – он тупо не работает. Хотя по логике, раз я создал окно в этом потоке, значит оно ему и принадлежит, следовательно ProcessMessages должно работать. Но не работает. И даже если я сам делаю PeekMessage/TranslateMessage/DispatchMessage, всё равно не пашет. Как решить эту проблему? Такое ощущение, что для всех создаваемых форм хозяином принудительно делается главный поток Добавлено Может, я туплю, конечно, где-то... покажите где. |
Сообщ.
#2
,
|
|
|
>Мне нужно создать форму в отдельном потоке и делать ProcessMessage в цикле.
Это техзадание такое? http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1411 |
Сообщ.
#3
,
|
|
|
Цитата MBo @ Ну почему ж ТЗ ?Это техзадание такое? Я прошу подсказки как это реализовать... и почему не пашет Исходники интересные, спасибо Но мне хочется понять, как это реализовать средствами . И действительно ли: Цитата Jin X @ ??? для всех создаваемых форм хозяином принудительно делается главный поток |
Сообщ.
#4
,
|
|
|
Цитата Jin X @ Такое ощущение, что для всех создаваемых форм хозяином принудительно делается главный поток В винде "хозяином" любого окна является поток, в котором это окно создано. Поэтому если форма создается через Synchronize в главном потоке и при этом явно или неявно происходит обращением к св-ву Handle формы, то ее "хозяином" будет главный поток. PS: Окно формы создается не сразу в Create, а при первом обращении к св-ву Handle. Чтобы окно 100% создавалось в конструкторе формы, нужно добавить в событие OnCreate обращение к св-ву Handle или вызвать метод HandleNeeded |
Сообщ.
#5
,
|
|
|
Если Synchronize всё равно вызывает метод из главного потока, как же мне создать VCL-форму из другого потока, чтобы окно принадлежало ему? Никак?
Добавлено Суть в том, что есть основной поток, который загружен своей работой (без окон), и напрягать его всякими Application.ProcessMessages не хочется (я бы даже сказал, это делать неудобно). Я хочу, чтобы окно обновлялось (перерисовывалось, реагировало на кнопки и пр.) в параллельном потоке (суть похожа на SplashScreen, только хочется сделать это VLC-методами). |
Сообщ.
#6
,
|
|
|
обычно в основном потоке ГУЙ, а в дополнительных какая-то тяжёлая работа
и никаких проблем... почему ты хочешь сделать наоборот? |
Сообщ.
#7
,
|
|
|
Цитата Jin X @ VCL-форму из другого потока, чтобы окно принадлежало ему? Никак? никак. VCL вообще однопоточна. |
Сообщ.
#8
,
|
|
|
Цитата Jin X @ Мне нужно создать форму в отдельном потоке Почему не воспользоваться CreateWindowEx, WinAPI? Вполне может сработать! Впрочем, нюансов про потоки что то не припомню, нужно проверять! |
Сообщ.
#9
,
|
|
|
Цитата Shaggy @ обычно в основном потоке ГУЙ, а в дополнительных какая-то тяжёлая работа и никаких проблем... почему ты хочешь сделать наоборот? Цитата Руслан @ Так и думал, что будут такие советы...Почему не воспользоваться CreateWindowEx, WinAPI? Ладно, я понял, что VCL в потоке – не лучший вариант... |
Сообщ.
#10
,
|
|
|
Цитата Jin X @ Так и думал, что будут такие советы... Могу короткий пример выдрать и своего проекта, легок для интеграции. Впрочем, довольно геморно компоненты располагать на форме - вручную(в моем древнем проекте всё есть)... |
Сообщ.
#11
,
|
|
|
Если у тебя через WinAPI, то примера MBo достаточно.
|
Сообщ.
#12
,
|
|
|
Собственно, в чем проблема-то? Создаешь поток, в нем создаешь форму, а затем начинаешь крутить цикл выборки сообщений. Все то же самое, что и для сплэш-формы. Разумеется, никакие Synchr и App.ProcMessages не используются, т.к. они рассчитаны только на штатную архитектуру "Гуй в главном потоке - все остальное в дочерних".
|
Сообщ.
#13
,
|
|
|
Да, только когда ты будешь делать GetMessage, сообщения тебе будут приходить для этого потока, а форма создаётся в главном потоке (даже при создании её из второго треда, поскольку нужно создавать её через Synchronize). Вот в этом и проблема.
|
Сообщ.
#14
,
|
|
|
Цитата Jin X @ поскольку нужно создавать её через Synchronize Кто тебе это сказал? |
Сообщ.
#15
,
|
|
|
VCL нельзя использовать в отдельно созданных тредах, могут возникать ошибки. И возникают. Например, вызываешь метод Show, и прога виснет. По крайней мере, если в основном треде идёт какой-то долгий процесс без чтения сообщений (Application.ProcessMessages и иже с ним).
|