![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Есть вот такой код (излишние детали были убраны, дабы не усложнять суть)
Тут происходит такая ситуация: форма создается, но сразу же уничтожается. Однако ссылки на неё остается в Components объекта Application, и соответственно при обращении к ней, таким образом, мы получаем исключения. В данной ситуации очень бы помог метод Synchronize. Но, к сожалению не понятно как синхронизировать метод другого класса (TMyClass). Можно было бы в данной ситуации создать ещё один метод, класса TMyTheard и синхронизировать его, но дело в том, что сам метод CreateForm может включать в себя ещё и другие методы класса TMyClass, а я не хочу всё это выполнять в VCL потоке. Мне в VCL потоке нужно только создать форму и всё! Надеюсь подробно описал ситуацию… Как в данном случае грамотно создать форму? И почему форма нормально живёт при создании с основного потока? |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
ответ на вопрос в заголовке: никак.
лучше опиши, зачем тебе это понадобилось. чтиво: Многопоточность - как это делается в Дельфи. |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
прочел не всю статью, ответа не нашёл. 1. Объект создает поток [MyCbj -> MyTh] 2. Поток выполняет действия [MyTh -> Execute] 3. Действия реализовано в другом классе [MyTh -> MyNewOb -> Work] 4. И отображает результат выполнения на форме (если её нет, то создаёт) [MyTh -> MyNewOb -> Work -> FormCreate] Примерно так Здесь я не вижу возможности синхронизировать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
библиотека VCL потокоНЕбезепасна... если хочешь создавать формы(окна) в потоках, то варианта 2: 1. писать полностью на WinAPI 2. найти потокобезопасную библиотеку с нужным функционалом
-------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Можно выкрутиться если разделить VCL. Я делал такую штуку, форму поместил в Dll, затем в новом потоке вызвал LoadLibrary и загрузил библиотеку с формой. Но тогда нужно исключить прямое взаимодействие форм. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
В моём случае, наверное, проще создать ещё один поток из класса, и с него обращаться к форме используя метод Synchronize. Но как, то через ж. получается
Если можно было бы выполнить в VCL потоке метод класса TMyClass |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
шото я не понял мечтаний... а что мешает то? -------------------- There are always someone smarter than you... |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Сам класс TMyClass создаётся в потоке TMyTheard, следовательно не имеет доступа к VCL потоку. И так как он не наследник TThread, у него нету метода Synchronize.
А другие объекты синхронизации насколько я понимаю, тут тоже не помогут. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
если покопаться, то можно увидеть у TThread классовую функцию Synchronize... возможно через нее получится поставить в очередь главному потоку метод стороннего класса
-------------------- There are always someone smarter than you... |
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Создание любого окна (как визуального, так и нет) в дополнительном потоке автоматически означает необходимость создания обработчика событий в этом потоке.
простейший вид обработчика:
но это не отменяет , посему работоспособность как минимум не гарантируется Добавлено через 6 минут и 31 секунду
Все события формы и всех компонентов на ней в любом случае будут вызываться в контексте потока, создавшего форму. Это сообщение отредактировал(а) kami - 17.3.2009, 23:46 |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
автор вроде имел ввиду просто сторонний класс. про форму не было упоминаний. все вроде бы верно, да только не "повесит" ли GetMessage поток до появления сообщения в очереди? а если мы хотим его (поток) грохнуть, а он все будет сообщение ждать... может использовать MsgWaitForMultipleObjects+PeekMessage? либо в деструкторе предусмотреть посылку "контрольного" сообщения при убийстве потока. -------------------- There are always someone smarter than you... |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Разумеется, повесит. Для выхода из цикла нужно послать WM_Quit (или "свое" сообщение, которое произведя дополнительные действия выведет из цикла). А PeekMessage будет постоянно напрягать OC пустыми циклами, что не есть хорошо. Если же добавить WaitForXXX, то такой вариант будет ничем не лучше моего. За одним исключением - с использованием WaitFor даже простейший таймер, созданный в этом потоке работать не будет, т.к. до DispatchMessage дело не дойдет. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
не понял мысли. почему не дойдет до диспатча? 1. MsgWaitFor... // ждем сообщение и/или любое другое событие С ТАЙМАУТОМ ожидания 2. Если пришло сообщение - получаем (GetMessage/PeekMessage) и обрабатываем (DispatchMessage) 3. Если таймаут - проверяем флаг Terminated 4. goto п.1. -------------------- There are always someone smarter than you... |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Что могу сказать? Снимаю шляпу и посыпаю голову пеплом. Никогда не использовал ожидание с таймаутом, вот и вылетело из головы напрочь Да и (главное) - не обратил внимание на MSGWaitFor Это сообщение отредактировал(а) kami - 18.3.2009, 20:14 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Любая форма использует объекь Application и нельзя от этого избавиться. Поэтому с формами никак не выкрутиться и невозможно их использовать в дополнительных потоках. -------------------- |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |