Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.06 c
2-1270734164
Pavel
2010-04-08 17:42
2010.08.27
Проблема с кодировкой


15-1265722998
Прохожий2
2010-02-09 16:43
2010.08.27
Помогите наладить комп.


15-1270124231
Славян
2010-04-01 16:17
2010.08.27
Нужна прога,которая берёт случайный набор слов и фраз(заданное на


2-1269287735
Сергей
2010-03-22 22:55
2010.08.27
Вращение объектов (шара вокруг своей оси)


15-1273077614
Вася
2010-05-05 20:40
2010.08.27
Передача с компьютера на телевизор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский