![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| aldari |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Привет всем!
Пишу DLL для проги Download Master. Надо в dll делать запросы в интернет. Хорошо! Использую блокирующий Indy. Чтобы запрос не блокировал обработку сообщений в основной программе помещаю запрос в поток TThread. Все работает. Дальше добавил в dll форму, в которой буду отображать результаты запросов. Возникла необходимость синхронизировать VCL потока и потока TThread с запросом. Форму создаю в конструкторе dll обычным образом:
В потоке по завершению запроса пытаюсь добавить результат в SettForm.QueueList:TListBox на форме след образом.
Форму отображаю так
В Download Master пользователь вызывает окно через PluginConfigure и возникает следующая стуация: Если окно скрыто, а поток запущен интерфейс программы блокируется и после завершения потока выскакивает ошибка "Error 1400 Неверный дескриптор окна." Если окно отобразить перед началом потока все изменения списка проходят успешно. Что надо сделать, чтобы во время работы потока в любой момент можно было вызвать PluginConfigure -- отобразить форму с измененым списком. Вот нашел статью на английском. http://www.delphi3000.com/articles/article_4807.asp?SK= Описывает мою ситуацию, объясняет причину, даже дает решение, но не понимаю как его адаптировать под мой случай. |
||||||
|
|||||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
ошибка в 17й строке.
не совсем понятны сии телодвижения... работа с VCL компонентом через сообщения... если это из доп.потока - то нельзя лезть в VCL таким образом. если это изпод synchronize, то непонятно, зачем опять же через сообщения... -------------------- There are always someone smarter than you... |
|||
|
||||
| aldari |
|
||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
Да любой код на VCL на WINAPI - суть отобразить результат. пусть SendMessage(SettForm.QueueList.Handle,LB_INSERTSTRING,-1,LongInt(@str[1])); или SettForm.QueueList.Items.Insert(SettForm.QueueList.Count,url);
Можно. Если делать все только через WINAPI нет необходимости вызывать Syncronize. Надо только избегать ситуации когда два потока меняют одну глобальную переменную. У меня не такач ситуация.
Вызов synhronize из dll приводит к облокировке дополнительного потока. Это уже упоминалось в http://forum.vingrad.ru/topic-159006.html из статьи
Если мое окно плагина видмо, то поток добавляет строчки в листбокс все ОК, а если нет то возникает ошибка 1400 Неверное значение потока.
напишу более короткий код, покзать саму ситуация без лишнего. |
||||||||||
|
|||||||||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
и где тут ВинАпи? если уж на то пошло, то делай окно настроек на чистом WinApi... и меньше размером без Forms, и граблей с работой VCL(форм в частности) в DLL избежишь.
ну да... тут основной поток вообще к приложению стороннему относится. посмотри, чему равно Hnd... и более красивым решением была бы передача значения хэндла листбокса при, например, старте потока... а не обращение из доп.потока к компонентам на форме. Это сообщение отредактировал(а) MetalFan - 31.3.2008, 18:22 -------------------- There are always someone smarter than you... |
||||
|
|||||
| aldari |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.3.2007 Репутация: нет Всего: нет |
В 17 строке
Спасибо за критику! Без нее я бы не стал что-либо менять. |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
и как, помогло?)
-------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "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. |