Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Остановка потока [D7, WinXP]


Страницы:   1 2 3 4

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(). Подробности в справке.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо