Форум: "Основная";
Текущий архив: 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
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c