Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Как убить поток?   Найти похожие ветки 

 
MegaVolt ©   (2006-04-17 11:06) [0]

Под Win98 у меня очень редко зависают потоки. Как можно их убить? TerminateThread не помогает.

Убить потоки сторонней прогой (PView95) тоже не получается.


 
Сергей М. ©   (2006-04-17 11:29) [1]


> зависают потоки


Значит, что-то в логике организации их работы у тебя неправильно.


> TerminateThread не помогает


Быть того не может.


 
MegaVolt ©   (2006-04-17 11:49) [2]

>Значит, что-то в логике организации их работы у тебя неправильно.

Не у меня а у мелкософта :( Виснет апишная функция для работы с сетью. Виснет только под 98.

>Быть того не может.

Может. Либо PView95 как монитор для потоков неподходит.


 
Сергей М. ©   (2006-04-17 11:55) [3]


> Виснет апишная функция для работы с сетью


Это какая ?


> Может


Что говорит GetLastError() ?


 
MegaVolt ©   (2006-04-17 12:51) [4]

>Это какая ?

Это уже обсуждалось. И ты в этом учавствовал задав кучу уточняющих вопросов. Функция gethostbyaddr.

>Что говорит GetLastError() ?

Я это не смотрел. Сейчас проверю.


 
Сергей М. ©   (2006-04-17 13:03) [5]


> ты в этом учавствовал


Следовало бы ссылку на то обсуждение привести.

Помнится, ты там вроде бы на icq-клиента бочку катил ?


> Функция gethostbyaddr


Используй асинхронную версию ф-ции, ничто этому не мешает.
Асинхронное исполнение вызова всегда можно корректно отменить.


> не смотрел


А следовало бы в первую очередь это сделать.


 
Сергей М. ©   (2006-04-17 13:10) [6]

К тому же на основании чего ты уверен, что принудительное терминирование потока, "висящего" на gethostbyaddr(), не приведет к утечке памяти ?


 
MegaVolt ©   (2006-04-17 14:52) [7]

>Следовало бы ссылку на то обсуждение привести.

А смысл там всё равно ничего кроме уточняющих вопросов нет :(

>Помнится, ты там вроде бы на icq-клиента бочку катил ?

Если ты полностью читал ветку то там я писал что ICQ клиент увеличивает вероятность а не единственный виновник.

>А следовало бы в первую очередь это сделать.

Сделал посмотрел. Из 6 повисших потоков 1 ругнулся на неправильный параметр. Остальные вернули операция выполнена успешно.

>К тому же на основании чего ты уверен, что принудительное терминирование потока, "висящего" на gethostbyaddr(), не приведет к утечке памяти ?

Тут в одной из тем меня старательно убеждали что после завершения программы винда освобождает все процессы и всю занятую память. Так что ничего страшного я не вижу.


 
Сергей М. ©   (2006-04-17 15:10) [8]


> там всё равно ничего кроме уточняющих вопросов нет


Потому что телодвижений твоих там не наблюдалось.
Одна только констатация сомнительных "фактов".


> я писал что ICQ клиент увеличивает вероятность


Глупости.
Ничего он не "увеличивает".
Это чисто умозрительное заключение.


> Из 6 повисших потоков 1 ругнулся на неправильный параметр.


Это как ? Матом что ли ?

>  Остальные вернули операция выполнена успешно

Значит оные реально уничтожены.


> Тут в одной из тем меня старательно убеждали что после завершения
> программы винда освобождает все процессы и всю занятую память.
>  Так что ничего страшного я не вижу


Все ж зависит от сквозной логики твоего приложения, каковая мне не ведома.
Может быть после уничтожения этого потока ты еще туеву хучу таких потоков запускаешь, еще задолго до ExitProcess()..
При этом шибко не удивляйся, когда ты получишь, к примеру, Out of memory.


 
MegaVolt ©   (2006-04-17 15:44) [9]

>Одна только констатация сомнительных "фактов".
>Это чисто умозрительное заключение.

Интересно с каких пор практические данные собранные в результате наблюдений становятся сомнительными и умозрительными?

>Потому что телодвижений твоих там не наблюдалось.

А советов куда двигать телом тама тоже не заметно было :( Собственно как и в этой теме.

>Это как ? Матом что ли ?

SysErrorMessage(GetLastError) вывел "неправильный параметр"

>Значит оные реально уничтожены.

Значит мелкософтовская утилитина которая идёт в поставке вижуал студио глючит и неправильно показывает количество запущенных потоков? Чем тогда смотреть количество запущенных потоков?

>Может быть после уничтожения этого потока ты еще туеву хучу таких потоков запускаешь

Это проверка на идиотизм или как? Если поток убивается нафига запускать ещё?

Есть какие либо идеи? Рекомендации что проверить или что то полезное что можно исспользовать? А то уже пол дня доказываю что я не дурак.


 
Сергей М. ©   (2006-04-17 16:12) [10]


> вывел "неправильный параметр"


Значит, неправильный и был передан.


> Это проверка на идиотизм или как?
> Если поток убивается нафига запускать ещё?


Это проверка на "или как".
Я понятия не имею о твоих программных действиях после того как ты принял решение терминировать поток и терминировал его.


> Есть какие либо идеи?


Они тебе уже известны - использовать асинхр.версию ф-ции.


 
MegaVolt ©   (2006-04-17 16:33) [11]

>Они тебе уже известны - использовать асинхр.версию ф-ции.

Изначально вопрос был про то как убить поток а не как правильно писать сетевые приложения.


 
Сергей М. ©   (2006-04-17 16:46) [12]


> про то как убить поток


Этим заведует TerminateThread().
Если ф-ция вернула True - поток убит, иначе см. GetLastError(). Не понимаю, в чем проблема ..


> а не как правильно писать сетевые приложения


Причем здесь "сетевые приложения" - это тоже на твоей совести.
Есть некий блок.вызов некоей п/п.
Если тебе не удалось "висящий" на ней снять поток с выполнения, и при этом ты не понял почему - это твои проблемы, а не проблемы ОС.


 
MegaVolt ©   (2006-04-17 17:07) [13]

>Не понимаю, в чем проблема ..

Проблема в том что пишет то она true а вот после этого всевозможные мониторы запущенных процессов показывают незавершенные потоки.

>то твои проблемы, а не проблемы ОС.

Странно до сих пор я считал что управление потоками это как раз дело ОС. Максимум что я могу сделать это попросить её это сделать через TerminatedThread()

И чем это должен заниматся поток чтобы его нельзя было остановить и убить? Ведь раз остальная винда работает то всё же винда получает управление.


 
Сергей М. ©   (2006-04-17 17:13) [14]


> пишет то она true а вот после этого всевозможные мониторы
> запущенных процессов показывают незавершенные потоки


Значит, если ты получил True, выкинь в мусор все эти "всевозможные мониторы", показывающие False.


> Максимум что я могу сделать это попросить её это сделать
> через TerminatedThread()


Да, разумеется.

Ты попросил - и система ответила TRUE ("готово").

В чем сомнение ?


> чем это должен заниматся поток чтобы его нельзя было остановить
> и убить?


Чем угодно.

Если у твоего процесса есть право на терминирование потока другого процесса, то тебя не должно волновать чем терминируемый поток занят в этот момент.


> раз остальная винда работает то всё же винда получает управление


Галиматья.


 
MegaVolt ©   (2006-04-17 17:21) [15]

>выкинь в мусор все эти "всевозможные мониторы", показывающие False

Т.е. монитор от самой мелкософт в мусорку? Т.е. винда сама признаётся что у неё зарегистрированы потоки а я этому должен неверить?


 
Eraser ©   (2006-04-17 17:53) [16]


> MegaVolt ©   (17.04.06 17:21) [15]

1. http://www.sysinternals.com/Utilities/ProcessExplorer.html вот хороший "монитор".
2. код в студию.


 
MegaVolt ©   (2006-04-17 18:44) [17]

>вот хороший "монитор".

Он точно так же как и мелкософтовский показывает наличие запущенного процесса количество потоков он не показывает :(

>код в студию

Код чего?
Цикла где потокам отправляется TerminatedThread()?

Rouse уже код смотрел у него глюков нет. Ни под 98 ни под ХР. У меня под ХР тоже пашет на ура под 98 есть проблемы на 2 машинах.
Я могу даже выложить работающий пример который у меня глючит но что с этого толку если он не воспроизводим вне моей сети.


 
MegaVolt ©   (2006-04-17 19:11) [18]

Оказывается всё проще.

Вот что мелкомягкие пишут на эту тему:

Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed.

Т.е. в системе он останется но вроде как уже удалён. Правда всё равно exe-шник остаётся занят и его нельзя перезаписать :(


 
Eraser ©   (2006-04-17 20:32) [19]


> MegaVolt ©

нет, дескриптор всё таки закрывается.

> Он точно так же как и мелкософтовский показывает наличие
> запущенного процесса количество потоков он не показывает
> :(

ещё как показывает, даже стек каждого можно посмотреть.


 
MegaVolt ©   (2006-04-17 20:38) [20]

>ещё как показывает, даже стек каждого можно посмотреть.

Ты уверен что это есть и под 98? Как смотреть количество потоков?


 
Eraser ©   (2006-04-17 21:32) [21]


> MegaVolt ©   (17.04.06 20:38) [20]

под 98 - не вкурсе.
Да и про эту ОС можно уже забывать, imho.


 
Германн ©   (2006-04-18 03:36) [22]


> Eraser ©   (17.04.06 21:32) [21]
>
>
> > MegaVolt ©   (17.04.06 20:38) [20]
>
> под 98 - не вкурсе.
> Да и про эту ОС можно уже забывать, imho.
>

Имхо, можно уже "начать забывать". Но учитывая МЕ. И учитывая, что все поголовно  юзеры откажутся от этой линейки ещё очень не скоро!


 
Сергей М. ©   (2006-04-18 08:16) [23]


> MegaVolt ©   (17.04.06 19:11) [18]


Показывай код цикла терминирования потоков ..


 
MegaVolt ©   (2006-04-18 16:01) [24]


procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
 j:longbool;
 TempIP:Cardinal;
begin
 with Form1.ListThead.LockList do
   try
     for i:=Count-1 downto 0 do
       begin
         TempIP:=PTheadItem(Items[i])^.IP;
         j:=TerminateThread(PTheadItem(Items[i])^.Thead.Handle,1);
         if j=false then ShowMessage(IPToStr(TempIP)+SysErrorMessage(GetLastError));
       end;
   finally
     Form1.ListThead.UnlockList;
   end;
end;



 
Сергей М. ©   (2006-04-18 16:23) [25]

Ну и где, спрашивается, CloseHandle() для каждого терминируемого потока ?


 
MegaVolt ©   (2006-04-18 17:27) [26]

>Ну и где, спрашивается, CloseHandle()

А что он нужен? А почему справка по поводу TerminateThread про это молчит?


 
Игорь Шевченко ©   (2006-04-18 17:36) [27]

MegaVolt ©   (18.04.06 17:27) [26]


> А что он нужен?


Нужен.


> А почему справка по поводу TerminateThread про это молчит


Как раз не молчит:

"Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed. "

Три последних слова ничего не напоминают ?


 
MegaVolt ©   (2006-04-18 17:43) [28]

Ага действительно я не так прочёл.

Добавил

  t:=CloseHandle(PTheadItem(Items[i])^.Thead.Handle);
  if t=false then ShowMessage(IPToStr(TempIP)+SysErrorMessage(GetLastError));


Результат тот же. Поток висит как и висел.


 
Eraser ©   (2006-04-18 18:13) [29]


> MegaVolt ©   (18.04.06 17:43) [28]

а нигде больше в приложении нету открытых дескрипторов этого потока?


 
MegaVolt ©   (2006-04-18 20:11) [30]

Вроде нету.

Вот как я создаю поток


  TheadItem^.Thead:=TScanIP.Create(true);


Глюк с неубиваемостью потоков присущь похоже только 98 винде :( В ХР всё пашет на ура. Да вообщем то в ХР оно и не виснет.


 
Eraser ©   (2006-04-18 20:26) [31]


> MegaVolt ©   (18.04.06 20:11) [30]


> Глюк с неубиваемостью потоков присущь похоже только 98 винде

и всё таки, как я думаю, ошибку надо искать в коде. Возможно внутри потока или из какой то ф-ии вызывается OpenThread.. иди ещё не понятно что...

вообще, как уже не один раз советовали, надо отказаться от использования принудительного завершения потока, т.к. при это есть след. недостатки:
-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.

PS используй WSAAsyncGetHostByAddr вместо gethostbyaddr.


 
MegaVolt ©   (2006-04-19 10:27) [32]

> используй WSAAsyncGetHostByAddr вместо gethostbyaddr.

Где гарантия что он будет работать нормально? Вряд ли было сделано 2 реализации одной и той же функции?

Кстати ещё виснет на открытии FTP в TIdFTP :( Его чем заменять?


 
Сергей М. ©   (2006-04-19 10:50) [33]


> Где гарантия что он будет работать нормально?


Гарантии раздает только Господь Бог) .. И то далеко не по каждому случаю)


> Вряд ли было сделано 2 реализации одной и той же функции?


Ну как же "вряд ли", когда MSDN и справка гласят

function is an asynchronous version of gethostbyaddr, and is used to retrieve host name and address information corresponding to a network address. Windows Sockets initiates the operation and returns to the caller immediately, passing back an opaque "asynchronous task handle" which the application can use to identify the operation. When the operation is completed, the results (if any) are copied into the buffer provided by the caller and a message is sent to the application"s window.

Если гложут сомнения, ты можешь в кач-ве эксперимента бросить на тестовую форму TClientSocket, установить св-ва Host, Port и попытаться подключиться к   указанному серверу. В дифолтном non-blocking-режиме компонент как раз и использует эту асинхр.версию ф-ции.


 
Сергей М. ©   (2006-04-19 10:55) [34]

Вру.

Там используется WSAAsyncGetHostByName().

Но это не суть как важно - обе ф-ции обращаются к DNS для прямого или обратного преобразования Имя <-> Адрес.


 
MegaVolt ©   (2006-04-19 14:35) [35]

Кстати вместо GetHostByAddr пробовал исспользовать NetBios запросы. Точно так же виснут :(


 
Сергей М. ©   (2006-04-19 14:57) [36]

У тебя явные проблемы с DNS.


 
MegaVolt ©   (2006-04-19 16:00) [37]

Не у меня а у нашей сетки :)
Только вот очень охото чтобы моя прога не зависела от глюков сети. Нет правильного ответа или есть но кривой считаем что нет данных и ладушки. А виснуть то зачем :(


 
Сергей М. ©   (2006-04-19 16:17) [38]


> виснуть то зачем


А никто и не "виснет" ...
Просто, думаю, ты не дожидаешься UDP-ответа на UDP-запрос к DNS.


 
MegaVolt ©   (2006-04-19 16:20) [39]

Что значит не дожидаюсь? В каком месте я могу управлять временем ожидания?


 
Сергей М. ©   (2006-04-19 16:40) [40]


> В каком месте я могу управлять временем ожидания?
>


Ни в каком.

Подожди 3..5 минут  - если DNS в принципе жива, тот или иной ответ будет получен.

А лучше не упрямься и последуй совету в [33].



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.01 c
15-1146599729
SergP
2006-05-02 23:55
2006.05.28
asm


15-1146663545
avsam
2006-05-03 17:39
2006.05.28
Компонента для ввода даты И времени


15-1146643908
tigra
2006-05-03 12:11
2006.05.28
Имена в архиве


2-1147306113
rosl
2006-05-11 04:08
2006.05.28
enter


6-1138449753
WebSQLNeeder
2006-01-28 15:02
2006.05.28
Вырезать html теги из произвольной строки типа string





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский