![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Остановка потока [D7, WinXP]
Destroyer © (2006-08-26 21:28:00)Задача выполняется в потоке. По нажатию кнопки на форме надо остановить выполнение потока. Проверять флаг постоянно на отключение - не подходит. Нужно что-то типа TimerThread.Destroy.
Делаю так:
protected
procedure Execute; override;
public
constructor Create(FPath: String; Fflag: boolean; RProcType:string; FExt:string);
constructor Destroy;
end;
...
constructor TimerThread.Destroy;
begin
exit;
end;
Но так, выдается ошибка неверный дескриптор.
Как правильно мгновенно остановить поток?
DVM (2006-08-27 22:40:00) [41]
> интересно, каким боком Synchronuze() относится к реализации
> TThread? это, вообще-то, проблема VCL.
A TThread не из VCL что ли?
y-soft (2006-08-27 22:37:00) [42]>Пусик © (27.08.06 22:34) [22]
...но как раз начинающим использование пула потоков рекомендовать нельзя слишком сложно для использования
IMHO намного проще получается, чем с TThread, но программирование действительно сложное занятие, особенно профессиональное :)
Ketmar (2006-08-27 22:36:00) [43]> [21] y-soft © (27.08.06 22:31)
интересно, каким боком Synchronuze() относится к реализации TThread? это, вообще-то, проблема VCL.
Пусик (2006-08-27 22:34:00) [44]
> y-soft © (27.08.06 22:31) [21]
> >Пусик © (27.08.06 22:27) [19]
>
> А что в нем кривого особо?
>
> ОСОБО кривого нет. Есть отдельные недодуманности. Например
> метод Synchronize - основная причина тормозов в многопоточных
> программах начинающих :)
>
> Вообще, начиная с Windows 2000 появилась прекрасная альтернатива
> TThread в большинстве случаев - системный пул потоков
Да, альтернатива есть, но как раз начинающим использование пула потоков рекомендовать нельзя слишком сложно для использования. Да и вряд ли у начинающих возникнут задачи, требующие подобного решения.
y-soft (2006-08-27 22:31:00) [45]>Пусик © (27.08.06 22:27) [19]
А что в нем кривого особо?
ОСОБО кривого нет. Есть отдельные недодуманности. Например метод Synchronize - основная причина тормозов в многопоточных программах начинающих :)
Вообще, начиная с Windows 2000 появилась прекрасная альтернатива TThread в большинстве случаев - системный пул потоков
DVM (2006-08-27 22:29:00) [46]
> Вряд ли она ВООБЩЕ хоть чуть-чуть глюконосная.
Глюки не в ней, а в неправильном ее использовании. Иногда даже и не подумаешь, что проблемы именно в ней.
Пусик (2006-08-27 22:27:00) [47]
> DVM © (27.08.06 22:08) [13]
>
> > FreeOnTerminate := True
>
> Крайне глюконосная фича.
Это еще почему?
Вряд ли она ВООБЩЕ хоть чуть-чуть глюконосная.
> y-soft © (27.08.06 22:12) [14]
>
> TThread в Delphi вообще написан довольно криво :(
А что в нем кривого особо?
y-soft (2006-08-27 22:25:00) [48]>DVM © (27.08.06 22:23) [17]
Я бы советовал в любом случае это делать
Конечно, если есть хотя бы один указатель на него и существует вероятность, что к нему возможно обращение
DVM (2006-08-27 22:23:00) [49]
> Для того, чтобы избежать глюков следует отловить завершение
> потока
Я бы советовал в любом случае это делать.
y-soft (2006-08-27 22:18:00) [50]>DVM © (27.08.06 22:08) [13]
FreeOnTerminate предполагает, что судьба потока после завершения неинтересна - завершился и самоуничтожился. Для того, чтобы избежать глюков следует отловить завершение потока (например, с помощью WaitForXXX) и обнулить указатели на него
Ketmar (2006-08-27 22:15:00) [51]поркзаная цитата из генофонда:
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
finally
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.DoTerminate;
Thread.FFinished := True;
SignalSyncEvent;
if FreeThread then Thread.Free;
EndThread(Result);
end;
end;
если писать корректно и не совершать страшного в OnTerminate(), то никаких глюков не вижу.
y-soft (2006-08-27 22:12:00) [52]>DVM © (27.08.06 22:08) [13]
TThread в Delphi вообще написан довольно криво :(
Но в большинстве случаев все работает
DVM (2006-08-27 22:08:00) [53]
> FreeOnTerminate := True
Крайне глюконосная фича.
y-soft (2006-08-27 22:06:00) [54]>Destroyer © (26.08.06 23:06) [5]
Не используйте TerminateThread, это чревато многими неприятностями и используется в самых крайних аварийных случаях
Самое правильное и простое в Вашем случае - установить при создании TTimerThread
FreeOnTerminate := True и периодически проверять флаг. Когда функция потока обнаружит, что флаг установлен - просто выходить из функции потока. Тогда и хендл потока Вам не понадобится
Другого корректного (а тем более "мгновенного" способа) в общем случае просто не существует (хотя могут и быть варианты в зависимости от того, чем конкретно занимается поток. Например, можно мгновенно отменить все операции ввода/вывода для файлового устройства, закрыв все открытые хендлы этого устройства)
Destroyer (2006-08-27 14:32:00) [55]Германн,
type
TimerThread = class(TThread)
begin...end,
В справке есть.
Indicates the thread's handle (Windows only).
Delphi syntax:
property Handle: THandle;
Видимо, то что нужно.
Но компилятор не принимает, ошибка: Method identifier expected.
begin...end (2006-08-27 09:02:00) [56]> Чапаев носками хакера (26.08.06 23:30) [6]
TThread.Handle. Подробности в справке.
Чапаев носками хакера (2006-08-27 08:54:00) [57]> Извините, конечно, но все что нашось в справке - OpenThread()
> that takes a thread ID and returns a thread handle. А где
> ID взфть?
Если поток твой, тебе лучше знать, какой у него TID. Если чужой, смотри справку по CreateToolhelp32Snapshot(), а дальше по ссылкам.
Германн (2006-08-27 01:46:00) [58]
> Но у меня поток создается способом см. выше. Может из него
> как-то хэндл взять?
А что тогда есть
> TimerThread
?
Я такого не знаю. Чей он потомок?
Destroyer (2006-08-27 01:02:00) [59]Извините, конечно, но все что нашось в справке - OpenThread() that takes a thread ID and returns a thread handle. А где ID взфть?
Также говорится, что хэндл получается при создании потока.
CreateThread() API is used to create threads.
Но у меня поток создается способом см. выше. Может из него как-то хэндл взять?
Чапаев носками хакера (2006-08-26 23:30:00) [60]> Где взять хэндл потока?
OpenThread(). Подробности в справке.