Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Как грамотно остановить, убить поток   Найти похожие ветки 

 
СержК   (2006-01-27 11:46) [0]

Народ подскажите.

Изучаю потоки. Создал поток. В этом потоке запускаю огромный цикл с выводом информации о работе потока(цикла)  на рабочую форму.

До тех пор пока работа цикла НЕ ЗАВЕРШЕНА, из главной формы пытаюсь остановить работу потока следующим образом:

procedure TForm1.Button2Click(Sender: TObject);
begin
MyThread.Suspended:=true;
MyThread.Terminate;
end;  - останавливается вроде все нормально

Но если я нажимаю кнопку Form1.Button2Click уже после как поток отработал, вываливается ошибка - "Отказано в доступе..."

Подскажите что я делаю не так?

Попутно вопросы:
1) Как правильно остановить поток
2) Как убить поток вообще


 
sniknik ©   (2006-01-27 12:02) [1]

MyThread.Suspended:=true;
приостановил поток

MyThread.Terminate;
дал ему команду завершится

которая не выполнится т.к. "огромный цикл" есть а проверки на завершение наверняка нет (не написано значит нет), и потом т.к. он приостановлен то команды в нем не выполняются... до resume.

> Подскажите что я делаю не так?
см. up.


 
СержК   (2006-01-27 13:17) [2]

Что-то не получается.
Привожу основную процедуру с "огромным циклом". Где и как я должен сделать - проверку на завершение???

procedure TMyThread.Execute;
var i:integer;
begin
For i:=1 to 100000 do
   begin
   Form1.RichEdit1.Lines.Add("Текущая строка - " + IntToStr(i));
   end;
end;


 
sniknik ©   (2006-01-27 13:39) [3]

к примеру вставив в цикл if Tetminated then Exit;

p.s. обращатся из потока к обьектам VCL нельзя... (и вообще любым если используются максимум 2мя потоками)


 
СержК   (2006-01-27 13:59) [4]

Если я правильно понял, то сделал следующее.

procedure TMyThread.Execute;
var i:integer;
begin
For i:=1 to 100000 do
  begin

  if Tetminated then Exit;

  Form1.RichEdit1.Lines.Add("Текущая строка - " + IntToStr(i));
  end;
end;

Но при компиляции выдает ошибку: Undeclared identifier: "Terminated"

???


 
Johnmen ©   (2006-01-27 14:02) [5]

Tetminated <> Terminated


 
sniknik ©   (2006-01-27 14:03) [6]

ошибся в написании...;( надо Terminated но ты сам то написал правильно, и неужели недогадался?


 
СержК   (2006-01-27 14:22) [7]

ok - Все заработало!!!

Торможу, убиваю поток - вроде все работает, но возник еще вопросик:
Когда мой поток отработал ("огромный цикл") его(поток) убивать нужно, или он сам собой?


 
Johnmen ©   (2006-01-27 14:29) [8]

Сам собой, если в процедуре создания укажешь FreeOnTerminate:=True


 
СержК   (2006-01-27 14:52) [9]

Пардон, но

FreeOnTerminate:=True  почемуто не понимает.

Опять тот же Undeclared identifier: "FreeOnTerminate"


 
sniknik ©   (2006-01-27 15:06) [10]

написано правильно... может не в том месте, не в то время? :)


 
СержК   (2006-01-27 15:24) [11]

Вот весь код.
Куда нужно вставить: FreeOnTerminate:=True

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Clear;
RichEdit1.Clear;
//**************************

LaunchYourThread("хххххххххх");

//***********************
end;

procedure TForm1.LaunchYourThread(const ADirectoryName: String);
begin
MyThread := TMyThread.Create(True, ADirectoryName);
MyThread.Resume;
end;

//**********************************************
//**********************************************

САМ ПОТОК

{ TMyThread }

constructor TMyThread.Create(CreateSuspennded: boolean;
 const ADirectoryName: String);
begin
inherited Create(CreateSuspennded);
FDirectoryName := ADirectoryName;
end;

procedure TMyThread.Execute;
var i:integer;
begin
for i:=1 to 10000 do
 begin
 Form1.RichEdit1.Lines.Add(IntToStr(i));
 end;
end;


 
SergP ©   (2006-01-28 03:15) [12]

Либо сюда:

procedure TForm1.LaunchYourThread(const ADirectoryName:
String);
begin
MyThread := TMyThread.Create(True, ADirectoryName);
MyThread.FreeOnTerminate:=True;
MyThread.Resume;
end;


либо сюда:


constructor TMyThread.Create(CreateSuspennded: boolean;
const ADirectoryName: String);
begin
inherited Create(CreateSuspennded);
FDirectoryName := ADirectoryName;
FreeOnTerminate:=True;
end;


ИМХО так...


 
SergP ©   (2006-01-28 03:19) [13]


> procedure TMyThread.Execute;
> var i:integer;
> begin
> for i:=1 to 10000 do
>  begin
>  Form1.RichEdit1.Lines.Add(IntToStr(i));
>  end;
> end;


И кстати, тебе уже писали что так делать не надо... Может работать, но могут быть страшные глюки



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

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
2-1139064948
Shizik
2006-02-04 17:55
2006.02.19
Как сделать выравнивание по ширине в Memo?


2-1138686124
Mike48
2006-01-31 08:42
2006.02.19
315-й вопрос про ehlib


4-1133630611
Bolek
2005-12-03 20:23
2006.02.19
работа со службой


15-1138315032
Стыдно
2006-01-27 01:37
2006.02.19
г/л в мл/м.куб


15-1138362588
DillerXX
2006-01-27 14:49
2006.02.19
Ноутбук - что посоветуете счастливому обладателю? :)