Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Есть небольшая проблема с запуском формы и потока из dll 


Upendra   (2002-04-13 10:16) [0]

Ситуация следующая - из длл загружается форма
потом из той же длл запускается поток, который для выдачи результатов использует элементы загруженной формы.
Все идет нормально до первого оператора Synchronize, где все это дело и замирает.
Вопрос - как это дело исправить ?
Заранее благодарен !



Fantasist   (2002-04-13 22:17) [1]

Деббагером смотрел? До какого места доходит? Где останавливается?
Хотя я думаю дело вот в чем: эта синхронизация обеспечивается за счет вызова глобальной функции CheckSynchonize в главном потоке, причем используя глобальные переменные. Synchronize просто ставит себя в очередь и ждет пока это произойдет. А так как dll у тебя компилируется отдельно, то все глобальные переменные(как и функции, но в данном случае это, пожалуй, не важно) для нее существуют отдельно, и твой основной процесс ничего об этом не знает.



Upendra   (2002-04-15 10:22) [2]

Спасибо !
Думаю так оно и происходит.
дебаггером идет до какого нить каптиона и тупо подвисает.
решил эту проблему заменой synchronize на

SM_SYNCMSG = WM_USER + $531;
SendMessage(Semform.Handle,SM_SYNCMSG, 0, 0);

Все заработало
Правда возникла другая проблема *)
функция onTerminate не выполняется, хотя присваивание проходит нормально... *(



Digitman   (2002-04-15 12:30) [3]

1. Обработчик OnTertminate() синхронизируется с осн.потоком (по кр.мере - в Д5), т.е. неявно вызывается в контексте Synchronize().

2. Метод Execute() у тебя, вполне возможно, корректно не завершается по каким-то причинам (бесконечный цикл, необработанное искл-е и т.п.)



Upendra   (2002-04-16 13:42) [4]

гм...
когда поток не находиться в длл - все работет просто прекрасно...
и OnTertminate() и Synchronize().
проблема возникла только при запихивании в длл.
поток достигает завершающего енд в Execute и все...
дальше дебаггер не идет *(

Дельфи 6 апдейт 2



Digitman   (2002-04-16 14:18) [5]

хм .. а как это он у тебя "достигает завершающего енд в Execute", если, сам же говоришь, на первом же "операторе Synchronize()... все это дело и замирает" ??
Ты исключения-то "гасишь" в Execute() ?



Upendra   (2002-04-16 19:07) [6]

я же выше говорил, что заменил Synchronize на
SM_SYNCMSG = WM_USER + $531;
SendMessage(Semform.Handle,SM_SYNCMSG, 0, 0);

которое и заменяет оператор синхронизации.
после чего и открылись новые проблемы *(



Fantasist   (2002-04-17 08:22) [7]

procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;


Это тебя беспокоит?
Все тот же Synchronize. ;)



Digitman   (2002-04-17 08:31) [8]

>Upendra

Если конструктор доп.потока, класс которого реализован в DLL, вызывается в доп.потоке хост-процесса, то эта ситуация вполне объяснима.

см.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017895661&n=3




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.016 c
14-94574          False                 2002-03-20 12:28  2002.04.29  
Какое расширение имееи Oracle?


14-94541          Knight                2002-03-21 13:21  2002.04.29  
вопросик имеется... типа


1-94447           Kordel                2002-04-16 01:52  2002.04.29  
Все еще про цвет в таблицах.


1-94416           ListView              2002-04-17 19:42  2002.04.29  
Как в ЛистВиеве при щелчке на каком нибуть итемсе получить егоимя


1-94399           Ezh                   2002-04-06 12:11  2002.04.29  
Из Экселя в СтрингГрид