Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть небольшая проблема с запуском формы и потока из 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 у тебя компилируется отдельно, то все глобальные переменные(как и функции, но в данном случае это, пожалуй, не важно) для нее существуют отдельно, и твой основной процесс ничего об этом не знает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо