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

Вниз

Как "убить" созданный THREAD   Найти похожие ветки 

 
AlexG ©   (2004-10-13 15:57) [0]

Не хочу я, чтобы продолжал работу мой поток. И мне нужно его остановить, но сразу, чтобы он не доделывал работу, которую он будет доделывать, если ему сказать Terminate. Например он пытается соединиться с БД и процесс затянулся. Если ему просто сказать, чтобы он остановился (Terminate)? то он дождется завершения работы соединения, и только потом закроется. А мне все равно в каком он состоянии, хочу чтобы он был закрыт. Как мне это сделать?


 
Дмитрий Ботвин   (2004-10-13 16:01) [1]

с помощью API-функции: TerminateThread(MyThread.Handle,0);
Срубит его мгновенно


 
AlexG ©   (2004-10-14 10:18) [2]

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


 
Дмитрий Ботвин   (2004-10-14 10:48) [3]

Как это не получается? TerminateThread-у похрену какой поток
рубить. Какая ошибка выходит???


 
tesseract   (2004-10-14 12:44) [4]

TerminateThread = Утечка памяти и баги в программе. лучше доработай процесс соединения с базой - там что таймаута нет?


 
Дмитрий Ботвин   (2004-10-14 12:49) [5]

[4] TerminateThread = Утечка памяти и баги в программе.
Не понял о какой утечке и о каких багах идет речь?????


 
tesseract   (2004-10-14 13:06) [6]

А той что после такого выхода из потока не освободяться ресурсы содержащиеся в потоке (не  выполниться FonTerminate и Destroy). Точно сказать нельзя, возможно Delphi автоматом выполнит Terminate после такой экзекуции, но скорей всего нет.


 
KSergey ©   (2004-10-14 13:41) [7]

> [6] tesseract   (14.10.04 13:06)
> Точно сказать нельзя, возможно Delphi автоматом
> выполнит Terminate после такой экзекуции, но скорей всего
> нет.

Нет. Ресурсы убьются только системой при завершении приложения.


 
Дмитрий Ботвин   (2004-10-14 13:46) [8]

Нет, если указать FreeOnTerminate:=true, то и ресурсы освободятся
после уничтожения потока....


 
VMcL ©   (2004-10-14 14:01) [9]

>>Дмитрий Ботвин  (14.10.04 13:46) [8]

После уничтожения функцией TerminateThread(), да ну? Или имеется в виду уничтожение объекта класса TThread?


 
Дмитрий Ботвин   (2004-10-14 14:07) [10]

Вот это уничтожит поток и освободит ресурсы:
begin
 TerminateThread(MyThread.Handle,0);
 MyThread.Free;
end;


 
KSergey ©   (2004-10-15 08:09) [11]

> [10] Дмитрий Ботвин   (14.10.04 14:07)

Только при условии, что захвачены они были в конструкторе и высвобождаются в деструкторе. Что далеко не всегда так, а часто - по определению невозможно (динамическое выделение блоков памяти в процессе работы, например; считаем, что в конктрукторе выделить их нельзя, т.к. заранее неизвестен объем)


 
Rouse_ ©   (2004-10-15 11:14) [12]

Сори, тест...


 
VMcL ©   (2004-10-15 15:50) [13]

>>Дмитрий Ботвин  (14.10.04 14:07) [10]

begin
  TerminateThread(MyThread.Handle, 0);
  MyThread.Free;
end;


Сейчас под рукой Delphi нет, чтобы проверить, но AFAIR, при вызове деструктора MyThread срейзится Exception, поскольку MyThread.Handle уже недействителен.

>>KSergey c  (15.10.04 08:09) [11]

Тем не менее ресурсы все равно можно (а часто и нужно) освободить в деструкторе. Вот пример:

...

interface

type
 TTest = class(TThread)
 private
   FSomeMem: Pointer;
 protected
   procedure Execute; override;
 public
   destructor Destroy; override;
 end;

implementation

procedure TTest.Execute;
begin
 // ...
 FSomeMem := AllocMem(Random(50000));
 // ...
 if SomeCondition then
 begin
   FreeMem(FSomeMem);
   FSomeMem := nil;
 end;
 // ...
end;

destructor TTest.Destroy;
begin
 if FSomeMem <> nil then
   FreeMem(FSomeMem);
 inherited Destroy;
end;

end.


 
VMcL ©   (2004-10-15 23:38) [14]

>>VMcL ©  (15.10.04 15:50) [13]

>Сейчас под рукой Delphi нет, чтобы проверить, но AFAIR, при вызове деструктора MyThread срейзится Exception, поскольку MyThread.Handle уже недействителен.

Пришел домой. Посмотрел (D6). Exception не рейзится. Так что с этим всё в порядке. Но в деструкторе класса TThread есть такой код:
if FHandle <> 0 then CloseHandle(FHandle);
А поскольку мы нить уже терминировали, но данный хендл теоретически может быть использован для другого ядрённого объекта, чей хендл мы в таком случае закроем. Это есть нехорошо.


 
VMcL ©   (2004-10-15 23:42) [15]

>А поскольку мы нить уже терминировали, но данный хендл теоретически может быть использован для другого ядрённого объекта

Эт я прогнал. Sorry.


 
AlexG ©   (2004-10-19 09:35) [16]

>Дмитрий Ботвин   (14.10.04 10:48) [3]
>Как это не получается? TerminateThread-у похрену какой поток
>рубить. Какая ошибка выходит???

Ошибка не выходит. Просто программа так же ждет окончания работы подсоединения к БД.


 
Erik1 ©   (2004-10-19 11:42) [17]

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


 
AlexG ©   (2004-10-19 11:59) [18]

//Erik1 ©   (19.10.04 11:42) [17]
Ты не знаешь, а говоришь... :) Спокойнее, про гонишь - это вообще никуда не годится. Код пока не дам, т.к. не вижу смысла в этом. Там все обычное. Я объясню ситуацию.
Я создал поток, в котором есть внутренний член TADOConnection. В Excecute происходит попытка соединения с БД. ADOConnection настраивается так, чтобы был асинхронный доступ, т.к. иначе основной поток все равно забивается. Так вот, событие OnClose не наступает до тех пор, пока не пройдет соединение или не отвалится по таймауту. Да, это странно, но оно так. Проверено. И поток не удается убить даже этим TerminateThread: процесс идет дальше,т.е. все ждет таймаута и только потом закрывается диалоговое окно.
Я выход нашел, но мне это все кажется немного странным, т.к. не знаю как эта адоха работает. Я понял, что она работает посредством COM, но почему она не дает себя "убить", и почемц нужно задавать модель многопоточности именно MTA, а не STA. Хотя понятно почему... :) Теперь понятно ;)


 
VMcL ©   (2004-10-21 07:40) [19]

>>AlexG ©  (19.10.04 11:59) [18]

>Код пока не дам, т.к. не вижу смысла в этом.

Тогда жди телепатов...


 
AlexG ©   (2004-10-21 10:59) [20]

http://delphimaster.net/view/3-1097649858/
http://delphimaster.net/view/3-1097649858/
Если так интересно, то советую еще эти ветки посмотреть. Там обсуждается одно и то же...



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

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

Наверх




Память: 0.53 MB
Время: 0.032 c
14-1098340117
gn
2004-10-21 10:28
2004.11.07
Стало возможным по документу вычислить принтер


14-1098361317
Gorlum
2004-10-21 16:21
2004.11.07
Собственно зачем нужно было смотреть эти DLL


3-1097394696
Black
2004-10-10 11:51
2004.11.07
Как получить в ListBox е Имена всех таблиц дазы данных ADO?


3-1096373594
NewGuest
2004-09-28 16:13
2004.11.07
проблема соединения с базой (dbase через ADO) на разных компах


14-1098276320
Nikolay M.
2004-10-20 16:45
2004.11.07
В продолжение темы дипломов, но о диссертациях..





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