Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Завершение потоков в dll


Автор: Чучмек 27.5.2011, 12:23
При завершении приложения, необходимо завершить работу потоков в dll.
Но при выполнении секции finalization, подключаемого в dll модуля (Потоки вынесены в отдельный модуль), потоки уже убиты.
Аналогично для DLL_PROCESS_DETACH завершающей процедуры  dll. 

Автор: Akella 27.5.2011, 12:26
Цитата(Чучмек @  27.5.2011,  12:23 Найти цитируемый пост)
При завершении приложения, необходимо завершить работу потоков в dll.


Цитата(Чучмек @  27.5.2011,  12:23 Найти цитируемый пост)
Но при выполнении секции finalization, подключаемого в dll модуля (Потоки вынесены в отдельный модуль), потоки уже убиты.


значит не нужно ничего завершать?


или В ЧЁМ ВОПРОС?

Автор: Чучмек 27.5.2011, 12:50
В dll, по необходимости, создается поток.
После выполнения своей задачи поток не уничтожается, а приостанавливается.(Вызывается Suspend в Execute).
Код

procedure TmyThread.Execute;
label start;
begin
...//Выделение ресурсов
start:
...
...
...
Suspend;
if not Terminated then goto start;
...//Освобождение ресурсов.

По необходимости поток повторно запускается.

При завершении приложения,важно освобождение ресурсов.
И только в своем потоке !!! -вызывается CoUnInitialize.

В finalization Все потоки уже преостановленны и вызов Resume не дает эфекта.
За раннее сообщить библиотеке  "что нужно выгружатся"  нет возможности 

Автор: MetalFan 27.5.2011, 12:57
1. Не использовать suspend
2. Проверять Terminated и ждать по таймауту, к примеру, события для продолжения работы.

Автор: Чучмек 27.5.2011, 13:09
Цитата(MetalFan @  27.5.2011,  12:57 Найти цитируемый пост)
Не использовать suspend

В finalization не приостановленный поток будет еще живой???

Автор: Чучмек 27.5.2011, 17:38
Цитата(MetalFan @  27.5.2011,  12:57 Найти цитируемый пост)
Проверять Terminated и ждать по таймауту, к примеру, события для продолжения работы.

Нет. Поток уже дохлый. 
Проверил
Код

ResetEvent(hEvent);
WaitForMultipleObjects(1, @hEvent, TRUE, INFINITE);//Остановка  в потоке
...
...
...
SetEvent(hEvent);//Запуск



Эфект такой же, как и при Suspend/Resume

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)