Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизКак корректно удалить экземпляр TThread из TList? Найти похожие ветки
← →
RWolf © (2010-05-13 16:09) [80]> Rouse_ © (13.05.10 15:59) [76]
> не убьеш ты в сервисе, зависнешь на попытке синхронизации
> с основным потоком который стоит в суспенде :)thd.Terminate;
thd.Resume;
//тут поток просыпается, видит, что его завершают, и выходит из Execute
thd.WaitFor;
> остальное гораздо качественнее и прозрачнее делается через
> апи
то есть через TerminateThread?
Выдержка из MSDN:
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:
* If the target thread owns a critical section, the critical section will not be released.
* If the target thread is allocating memory from the heap, the heap lock will not be released.
* If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread’s process could be inconsistent.
* If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL
← →
DVM © (2010-05-13 16:13) [81]
> Rouse_ © (13.05.10 16:04) [78]
> http://rouse.drkb.ru/winapi.php#enumopenfiles
Будет время посмотрю :)
> Сервис конечно-же апишный ибо я про него говрю?
Я про VCL вообще то говорил.
← →
Rouse_ © (2010-05-13 16:14) [82]
> RWolf © (13.05.10 16:09) [80]
> thd.Terminate;
> thd.Resume;
> //тут поток просыпается, видит, что его завершают, и выходит
> из Execute
> thd.WaitFor;
И после этого входит в дедлок на функции thd.WaitFor.
А по поводу MSDN - это все конечно хорошо, и то что ты читаешь сию справку - выше всяких похвал, но понимаешь в чем дело, есть множество ситуаций (пару которых я привел) в которых не обойтись никак без терминирования, о чем кстати писал в свое время Руссинович описывая решение проблемы с NtQueryObject
← →
Rouse_ © (2010-05-13 16:15) [83]
> DVM © (13.05.10 16:13) [81]
> Я про VCL вообще то говорил.
VCL-ный не писал, там как раз должно быть нормально ибо вся эта ахинея с синхронизацией в отчасти как раз с огладкой на VCL-ный сервис и писалась.
А сделали бы по нормальному - синхронизация не с рутом, а с породившей нитью - вот бы сразу все шеколадно стало.
← →
RWolf © (2010-05-13 16:18) [84]
> И после этого входит в дедлок на функции thd.WaitFor.
доступ к какому ресурсу вызывает этот дедлок?
имхо, всё прозрачно — поток осознал необходимость завершиться и вышел, при этом основной поток, ожидающий его хэндл в методе thd.WaitFor, получил управление.
← →
Rouse_ © (2010-05-13 16:19) [85]
> RWolf © (13.05.10 16:18) [84]
>
>
> > И после этого входит в дедлок на функции thd.WaitFor.
>
> доступ к какому ресурсу вызывает этот дедлок?
Пфф, ну я же уже раза три писал: при синхронизации с главной нитью АПИ сервиса - которая служит для общения с SCM и все время висит в суспенде.
← →
Rouse_ © (2010-05-13 16:21) [86]Т.е. главная нить - она на самом деле не главная. Для каждого сервиса в рамках процесса создается своя нить, причем если в рамках процесса крутиться два и более сервисов (SHARE флаг) то у каждого из них своя нить, а главная всегда висит.
← →
Leonid Troyanovsky © (2010-05-13 16:25) [87]
> RWolf © (13.05.10 16:18) [84]
> > И после этого входит в дедлок на функции thd.WaitFor.
> доступ к какому ресурсу вызывает этот дедлок?
Ну, тут раньше говорили про OnTerminate, в котором поток
удалял ссылку на себя из списка.
Николай, правда, показал как в этом случае надо поступить,
т.е., Terminate по списку и ждать пока список опустеет.
--
Regards, LVT.
← →
RWolf © (2010-05-13 16:36) [88]
> при синхронизации с главной нитью АПИ сервиса - которая служит для общения с SCM и все время висит в суспенде.
пусть висит — при завершении сервиса проснётся и вызовет событие TService.OnStop, где мы и завершим все свои потоки; или нет?
← →
Игорь Шевченко © (2010-05-13 17:02) [89]Значит, борландовских Demos недостаточно. Печально.
← →
Rouse_ © (2010-05-13 17:03) [90]
> пусть висит — при завершении сервиса проснётся
А когда наступит завершение, если все три нити висят? :)
← →
Rouse_ © (2010-05-13 17:04) [91]
> и вызовет событие TService.OnStop, где мы и завершим все
> свои потоки; или нет?
Да и какой TService - ты не внимательно читаешь - я же особо упоминал про не VCL сервис :)
← →
RWolf © (2010-05-13 17:07) [92]
> А когда наступит завершение, если все три нити висят? :)
Если все висят, то такое приложение завершить можно только через диспетчер задач. Какая-то выделенная нить должна бодрствовать и ждать сигналов.
← →
Rouse_ © (2010-05-13 17:13) [93]
> RWolf © (13.05.10 17:07) [92]
> Если все висят, то такое приложение завершить можно только
> через диспетчер задач. Какая-то выделенная нить должна бодрствовать
> и ждать сигналов.
Это и есть главная нить службы - но она не бодрствует а находится в суспенде. Мехянику работы сервисов можешь почерпнуть вот из этого талмуда :)
http://rouse.drkb.ru/books.php#rihter1
← →
RWolf © (2010-05-13 17:20) [94][93]
спасибо, прочитаю.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.068 c