![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Gnusss |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 19.1.2005 Репутация: нет Всего: нет |
Привет всем.
Столкнулся В DLL создаю потоки (TThread),каждый поток создает (TIdHTTP) и закачивает нужные данные. Но проблема в том, что при вызове Synchronize выполнение потока останавливается, а Synchronize не выполняется. И главное поток не закрывается, а просто зависает и дальше ничего не делает. Из-за чего может возникать такая проблема, даже не представляю, т.к. раньше не когда не работал с потоками в DLL. Может, есть, какие особенности при работе с потоками в DLL? Заранее благодарю за ответ. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: 2 Всего: 5 |
Есть особенности пользования Synchronize в dll ;)
Может, обойдешься другими средствами? Сообщениями, например? |
|||
|
||||
| Dinosauro |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.6.2007 Репутация: нет Всего: нет |
Когда-то тоже натыкался на данную проблему.
Я считаю это не доработкой VCL. Одним из вариантов решения данной проблемы время от времени продергивать в основном потоке метод CheckSynchronize(). ниже приведен код класса, который в таймере это и делает (код на С++, но я думаю там все ясно). Попробуй создать подобный объект в основном потоке.
|
|||
|
||||
| Gnusss |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 19.1.2005 Репутация: нет Всего: нет |
||||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
открываешь ДНК VCL и "читаешь" про особенности "из первых рук". ... откуда можно выяснить, что объекты TApplication несколько отличаются в приложении и DLL, что накладывает ограничение на использование TThread.Synchronize в DLL. -------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ага TApplication просто не обрабатывает очередь сообщений, а потому не вызвает обработчик onIdle. Вообще принцип таков, поток ставит блокировку (входит в критическую секцию, которая есть и в Application.onIdle), но для того чтобы она сработала основной поток должен войти в обработчик Application.onIdle и там "освободить" второй поток после чего самому заблокироваться на критической секции занятой в Synchronize. Т.е. в Synchronize второй поток ждет пока закончит работу основной поток и залочиться после чего будет работать только он один. Но обработчик onIdle вызывается в Application.run, которое не вызывается в Dll никогда так как у нее нет своей очереди сообщений. Потому Synchronize безвременно ждет пока основной поток залочиться, но это никогда не произойдет. Это сообщение отредактировал(а) Alexeis - 13.6.2007, 18:54 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "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. |