Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потоков в dll 
V
    Опции темы
aldari
  Дата 31.3.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



 Привет всем!
 
 Пишу DLL для проги Download Master. Надо в dll делать запросы в интернет. 

 Хорошо! Использую блокирующий Indy. Чтобы запрос не блокировал 
 обработку сообщений в основной программе помещаю запрос в поток TThread.
 Все работает. Дальше добавил в dll форму, в которой буду отображать результаты
 запросов.  Возникла необходимость синхронизировать VCL потока и потока TThread с запросом.

 Форму создаю в  конструкторе dll обычным образом:
 
Код

 SettForm:=TSettings.Create(Application);
 

 
 В потоке по завершению запроса пытаюсь добавить результат в SettForm.QueueList:TListBox на форме след образом.
 
Код
 
 procedure TMySimplePlugIn.Queue_Push(const xml:string);
 var
  str:string;
  Hnd:HWND;
 begin
  Hnd:=SettForm.QueueList.Handle;
  str:=xml+#0;
  // если подобной ссылки нет вставить в конец списка
  if SendMessage(Hnd,LB_FINDSTRINGEXACT,-1,LongInt(@str[1]))=LB_ERR then
    SendMessage(Hnd,LB_INSERTSTRING,-1,LongInt(@str[1]));
 end;
 

 
 Форму отображаю так
Код

 procedure TMySimplePlugIn.PluginConfigure(params: WideString);
begin
 try
   SettForm.Show;
 except
   on E:exception do Message('Ошибка плагина :'+E.message);
 end;
end;


 В Download Master пользователь вызывает окно через PluginConfigure и возникает следующая стуация:
 Если окно скрыто, а поток запущен интерфейс программы блокируется и после завершения потока выскакивает ошибка "Error 1400 Неверный дескриптор окна."
 Если окно отобразить перед началом потока  все изменения списка проходят успешно.
 Что надо сделать, чтобы во время работы потока в любой момент можно было вызвать PluginConfigure --
 отобразить форму с измененым списком.

 Вот нашел статью на английском.  smile 
 http://www.delphi3000.com/articles/article_4807.asp?SK=
 Описывает мою ситуацию, объясняет причину, даже дает решение, 
 но не понимаю как его адаптировать под мой случай.

PM MAIL   Вверх
MetalFan
Дата 31.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



ошибка в 17й строке.

Цитата(aldari @  31.3.2008,  15:36 Найти цитируемый пост)
  Hnd:=SettForm.QueueList.Handle;
  str:=xml+#0;
  // если подобной ссылки нет вставить в конец списка
  if SendMessage(Hnd,LB_FINDSTRINGEXACT,-1,LongInt(@str[1]))=LB_ERR then
    SendMessage(Hnd,LB_INSERTSTRING,-1,LongInt(@str[1]));

не совсем понятны сии телодвижения... работа с VCL компонентом через сообщения...
если это из доп.потока - то нельзя лезть в VCL таким образом.
если это изпод synchronize, то непонятно, зачем опять же через сообщения...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aldari
Дата 31.3.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Цитата

не совсем понятны сии телодвижения... работа с VCL компонентом через сообщения...

Да любой код на VCL на WINAPI - суть отобразить результат.
пусть SendMessage(SettForm.QueueList.Handle,LB_INSERTSTRING,-1,LongInt(@str[1]));
или SettForm.QueueList.Items.Insert(SettForm.QueueList.Count,url);

Цитата

если это из доп.потока - то нельзя лезть в VCL таким образом.

Можно. Если делать все только через WINAPI нет необходимости вызывать Syncronize. 
Надо только избегать ситуации когда два потока меняют одну глобальную переменную. У меня не такач ситуация.

Цитата

если это изпод synchronize, то непонятно, зачем опять же через сообщения...

Вызов synhronize из dll приводит к облокировке дополнительного потока.
Это уже упоминалось в  http://forum.vingrad.ru/topic-159006.html

из статьи 
Цитата

Starting from Delphi 6 the VCL synchronization mechanism underwent big changes. It does not use anymore any hidden window handles in order to organize method calls between Delphi threads. All these changes were necessary for VCL library to be compatible with Kylix version of VCL.

Если мое окно плагина видмо, то поток добавляет строчки в листбокс все ОК, а если нет то возникает ошибка
1400 Неверное значение потока.

Цитата

ошибка в 17й строке.

напишу более короткий код, покзать саму ситуация без лишнего.
PM MAIL   Вверх
MetalFan
Дата 31.3.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(aldari @  31.3.2008,  16:16 Найти цитируемый пост)
Можно. Если делать все только через WINAPI нет необходимости вызывать Syncronize. 

Цитата(aldari @  31.3.2008,  15:36 Найти цитируемый пост)
  Hnd:=SettForm.QueueList.Handle;

и где тут ВинАпи?
если уж на то пошло, то делай окно настроек на чистом WinApi... и меньше размером без Forms, и граблей с работой VCL(форм в частности) в DLL избежишь.

Цитата(aldari @  31.3.2008,  16:16 Найти цитируемый пост)
Вызов synhronize из dll приводит к облокировке дополнительного потока.

ну да... тут основной поток вообще к приложению стороннему относится.

посмотри, чему равно Hnd... 
и более красивым решением была бы передача значения хэндла листбокса при, например, старте потока... 
а не обращение из доп.потока к компонентам на форме.







Это сообщение отредактировал(а) MetalFan - 31.3.2008, 18:22


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aldari
Дата 2.4.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.3.2007

Репутация: нет
Всего: нет



Цитата

ошибка в 17й строке.

 В 17 строке 
Код

Hnd:=SettForm.QueueList.Handle;


Спасибо за критику! Без нее я бы не стал что-либо менять. smile  
PM MAIL   Вверх
MetalFan
Дата 2.4.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



и как, помогло?)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.