Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1135111481
kreyl
2005-12-20 23:44
2006.02.19
Обновление TADODataSet из TClientDataSet


15-1138013263
pavel_guzhanov
2006-01-23 13:47
2006.02.19
DirectX или OpenGL


15-1138476997
syte_ser78
2006-01-28 22:36
2006.02.19
dma для dvd


3-1135271039
Asail
2005-12-22 20:03
2006.02.19
Еще вопрос (TDataSetTableProducer)...


1-1137507030
belenkov
2006-01-17 17:10
2006.02.19
Циклический опрос COM порта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский