![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Есть небольшая проблема с запуском формы и потока из dll [D6, Win95/98, Win2k]
Upendra © (2002-04-13 10:16:00)Ситуация следующая - из длл загружается форма
потом из той же длл запускается поток, который для выдачи результатов использует элементы загруженной формы.
Все идет нормально до первого оператора Synchronize, где все это дело и замирает.
Вопрос - как это дело исправить ?
Заранее благодарен !
Digitman (2002-04-17 08:31:00) [1]>Upendra
Если конструктор доп.потока, класс которого реализован в DLL, вызывается в доп.потоке хост-процесса, то эта ситуация вполне объяснима.
см.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1017895661&n=3
Fantasist (2002-04-17 08:22:00) [2]
procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;
Это тебя беспокоит?
Все тот же Synchronize. ;)
Upendra (2002-04-16 19:07:00) [3]я же выше говорил, что заменил Synchronize на
SM_SYNCMSG = WM_USER + $531;
SendMessage(Semform.Handle,SM_SYNCMSG, 0, 0);
которое и заменяет оператор синхронизации.
после чего и открылись новые проблемы *(
Digitman (2002-04-16 14:18:00) [4]хм .. а как это он у тебя "достигает завершающего енд в Execute", если, сам же говоришь, на первом же "операторе Synchronize()... все это дело и замирает" ??
Ты исключения-то "гасишь" в Execute() ?
Upendra (2002-04-16 13:42:00) [5]гм...
когда поток не находиться в длл - все работет просто прекрасно...
и OnTertminate() и Synchronize().
проблема возникла только при запихивании в длл.
поток достигает завершающего енд в Execute и все...
дальше дебаггер не идет *(
Дельфи 6 апдейт 2
Digitman (2002-04-15 12:30:00) [6]1. Обработчик OnTertminate() синхронизируется с осн.потоком (по кр.мере - в Д5), т.е. неявно вызывается в контексте Synchronize().
2. Метод Execute() у тебя, вполне возможно, корректно не завершается по каким-то причинам (бесконечный цикл, необработанное искл-е и т.п.)
Upendra (2002-04-15 10:22:00) [7]Спасибо !
Думаю так оно и происходит.
дебаггером идет до какого нить каптиона и тупо подвисает.
решил эту проблему заменой synchronize на
SM_SYNCMSG = WM_USER + $531;
SendMessage(Semform.Handle,SM_SYNCMSG, 0, 0);
Все заработало
Правда возникла другая проблема *)
функция onTerminate не выполняется, хотя присваивание проходит нормально... *(
Fantasist (2002-04-13 22:17:00) [8]Деббагером смотрел? До какого места доходит? Где останавливается?
Хотя я думаю дело вот в чем: эта синхронизация обеспечивается за счет вызова глобальной функции CheckSynchonize в главном потоке, причем используя глобальные переменные. Synchronize просто ставит себя в очередь и ждет пока это произойдет. А так как dll у тебя компилируется отдельно, то все глобальные переменные(как и функции, но в данном случае это, пожалуй, не важно) для нее существуют отдельно, и твой основной процесс ничего об этом не знает.