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;
Но так, выдается ошибка неверный дескриптор.
Как правильно мгновенно остановить поток?


y-soft   (2006-08-30 20:21:00) [1]

>Reindeer Moss Eater ©   (30.08.06 18:42) [64]

Из условия не видно, что пользователь не может произвести действия, которые вызовут, например,  RecreateWnd для главной формы, и в конечном итоге изменят хендл ее окна. С окном приложения такого точно не произойдет


Reindeer Moss Eater   (2006-08-30 18:42:00) [2]

разницы-то вроде никакой


y-soft   (2006-08-30 17:51:00) [3]

>Reindeer Moss Eater ©   (30.08.06 16:26) [62]

С Вашего позволения дополню

Именно главного окна (Application.Handle), а не главной формы, и обрабатывать в Application.OnMessage... И использовать PostMessage


Reindeer Moss Eater   (2006-08-30 16:26:00) [4]

Создай поток, передай ему хендл главного окна.
Если собираешься прибивать поток снаружи сохрани хендл потока.
В конце Execute пошли сообщение хендлу окна.
В обработчике сообщения главного окна прими сообщение.
И все.


Dmitrij_K   (2006-08-30 16:25:00) [5]

Thread.OnTerminate := твоё
сникерсни Ж)


Reindeer Moss Eater   (2006-08-30 16:22:00) [6]

Какого только бреда не придумают, только чтобы не думать головой.


Destroyer   (2006-08-30 16:21:00) [7]

А как с OnTerminate?
Вот решил эту проблему так:
...
 public
 destructor Destroy; override;
...
destructor TimerThread.Destroy;
begin
inherited;
MainForm.StopOperationButton.Enabled:=false;
end;


Dmitrij_K   (2006-08-30 16:14:00) [8]

OnTerminate не подходит?


Destroyer   (2006-08-30 16:11:00) [9]

Такой вопрос. Нужно выполнять действие, в данном случае деактивировать кнопку на главной форме, при каждом завершении потока. Что-то типа события OnTerminate. Подскажите как такое осуществить.


Ketmar   (2006-08-29 09:47:00) [10]

> [55] Slym ©   (29.08.06 04:34)
нет. апофигеоз. %-)


Slym   (2006-08-29 04:34:00) [11]

Ketmar ©   (28.08.06 14:32) [54]
ибо если мне нужны такие условия

ИнкапсЮляция батенька :)


Ketmar   (2006-08-28 14:32:00) [12]

> [53] Slym ©   (28.08.06 14:05)
и не подумаю. ибо если мне нужны такие условия, то я буду думать над переделкой кода, а не над тем, как вилами геморрой лечить. %-)


Slym   (2006-08-28 14:05:00) [13]

сделай так чтоб этот код выполнялся менее секунды :)
ограничения:
1. публиковать Event низя, или иначе управлять им не из TxThread
program Project1;
{$APPTYPE CONSOLE}
uses classes,SyncObjs,Windows;
type
 TxThread=class(TThread)
 private
   Event:TSimpleEvent;
 protected
   procedure Execute;override;
 public
   constructor Create(CreateSuspended: Boolean);
   destructor Destroy; override;
 end;

constructor TxThread.Create(CreateSuspended: Boolean);
begin
 Event:=TSimpleEvent.Create;
 inherited;
end;

destructor TxThread.Destroy;
begin
 inherited;
 Event.Free;
end;

procedure TxThread.Execute;
begin
 repeat
   Event.WaitFor(60000);
   writeln('loop :)');
 until terminated;
end;

var x:TxThread;
begin
 x:=TxThread.Create(false);
 sleep(0);
 x.Free;
 writeln('Final!');
end.


Ketmar   (2006-08-28 12:11:00) [14]

ну напиши свой класс. там кода-то...


Slym   (2006-08-28 12:02:00) [15]

Ketmar ©   (28.08.06 10:43) [35]
> прерывать синхронный вызов
это что такое? поподробней можно?

procedure TxThread.Execute;
begin
 while not terminated do
   Event.WaitFor(INFINITY);
end;

еслиб procedure TThread.Terminate; был virtual яб его

procedure TxThread.Terminate; override;
begin
 inherited;
 Event.Signal;
end;


y-soft   (2006-08-28 11:14:00) [16]

>Ketmar ©   (28.08.06 11:12) [48]

а мы их напугаем SetUnhandledExceptionFilter()'ом. %-)

Ну, ежели охота в такие глубины лезть :)


y-soft   (2006-08-28 11:12:00) [17]

>Ketmar ©   (28.08.06 11:10) [46]

Не повара, а блюдо


Ketmar   (2006-08-28 11:12:00) [18]

> [47] y-soft ©   (28.08.06 11:11)
а мы их напугаем SetUnhandledExceptionFilter()'ом. %-)


y-soft   (2006-08-28 11:11:00) [19]

>Ketmar ©   (28.08.06 11:06) [44]
> [42] y-soft ©   (28.08.06 11:01)
а исключения без менеджера памяти не живут. %-)


Unhandled exceptions еще как живут и побеждают с криком: "Ваше приложение выполнило недопустимую операцию и будет закрыто" :)


Ketmar   (2006-08-28 11:10:00) [20]

> [45] y-soft ©   (28.08.06 11:08)
конечно, выбор есть. но если кто-то не любит селёдку, это не причина ругать повара?


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

Наверх

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