![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить поток? [D5, Win95/98]
MegaVolt © (2006-04-17 11:06:00)Под Win98 у меня очень редко зависают потоки. Как можно их убить? TerminateThread не помогает.
Убить потоки сторонней прогой (PView95) тоже не получается.
Сергей М. (2006-04-21 08:38:00) [1]
> будет виснуть только FTP
Пиши в св-во IdFTP.Host не имя хоста, а IP-адрес, который перед этим получай средствами WSAAsyncGetHostByName.
MegaVolt (2006-04-20 10:23:00) [2]Ну последую я этому совету будет виснуть только FTP легче не станет :(
Сергей М. (2006-04-19 16:40:00) [3]
> В каком месте я могу управлять временем ожидания?
>
Ни в каком.
Подожди 3..5 минут - если DNS в принципе жива, тот или иной ответ будет получен.
А лучше не упрямься и последуй совету в [33].
MegaVolt (2006-04-19 16:20:00) [4]Что значит не дожидаюсь? В каком месте я могу управлять временем ожидания?
Сергей М. (2006-04-19 16:17:00) [5]
> виснуть то зачем
А никто и не "виснет" ...
Просто, думаю, ты не дожидаешься UDP-ответа на UDP-запрос к DNS.
MegaVolt (2006-04-19 16:00:00) [6]Не у меня а у нашей сетки :)
Только вот очень охото чтобы моя прога не зависела от глюков сети. Нет правильного ответа или есть но кривой считаем что нет данных и ладушки. А виснуть то зачем :(
Сергей М. (2006-04-19 14:57:00) [7]У тебя явные проблемы с DNS.
MegaVolt (2006-04-19 14:35:00) [8]Кстати вместо GetHostByAddr пробовал исспользовать NetBios запросы. Точно так же виснут :(
Сергей М. (2006-04-19 10:55:00) [9]Вру.
Там используется WSAAsyncGetHostByName().
Но это не суть как важно - обе ф-ции обращаются к DNS для прямого или обратного преобразования Имя <-> Адрес.
Сергей М. (2006-04-19 10:50:00) [10]
> Где гарантия что он будет работать нормально?
Гарантии раздает только Господь Бог) .. И то далеко не по каждому случаю)
> Вряд ли было сделано 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-режиме компонент как раз и использует эту асинхр.версию ф-ции.
MegaVolt (2006-04-19 10:27:00) [11]> используй WSAAsyncGetHostByAddr вместо gethostbyaddr.
Где гарантия что он будет работать нормально? Вряд ли было сделано 2 реализации одной и той же функции?
Кстати ещё виснет на открытии FTP в TIdFTP :( Его чем заменять?
Eraser (2006-04-18 20:26:00) [12]
> 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-18 20:11:00) [13]Вроде нету.
Вот как я создаю поток
TheadItem^.Thead:=TScanIP.Create(true);
Глюк с неубиваемостью потоков присущь похоже только 98 винде :( В ХР всё пашет на ура. Да вообщем то в ХР оно и не виснет.
Eraser (2006-04-18 18:13:00) [14]
> MegaVolt © (18.04.06 17:43) [28]
а нигде больше в приложении нету открытых дескрипторов этого потока?
MegaVolt (2006-04-18 17:43:00) [15]Ага действительно я не так прочёл.
Добавил
t:=CloseHandle(PTheadItem(Items[i])^.Thead.Handle);
if t=false then ShowMessage(IPToStr(TempIP)+SysErrorMessage(GetLastError));
Результат тот же. Поток висит как и висел.
Игорь Шевченко (2006-04-18 17:36:00) [16]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:27:00) [17]>Ну и где, спрашивается, CloseHandle()
А что он нужен? А почему справка по поводу TerminateThread про это молчит?
Сергей М. (2006-04-18 16:23:00) [18]Ну и где, спрашивается, CloseHandle() для каждого терминируемого потока ?
MegaVolt (2006-04-18 16:01:00) [19]
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 08:16:00) [20]
> MegaVolt © (17.04.06 19:11) [18]
Показывай код цикла терминирования потоков ..