Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизКак грамотно остановить, убить поток Найти похожие ветки
← →
СержК (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c