Вниз
Скачать: CL | DM;

Потоки   Найти похожие ветки 

← →
Рома....   (2008-02-26 09:52) [0]

Помогите разобраться. Я написал небольшой код который работает в потоке, мне нужно что бы после выполнения это кода появилось уведомление в виде ShowMessage() мол ваша программа закончила обработку. Как мне переделать программу так, что бы сделать это аккуратно и правильно ?  

type
 TTestThread = class(TThread)
 protected
   procedure Execute; override;
 end;

procedure TTestThread.Execute;
var
 I: Integer;
begin
 for I := 1 to 2 do
   begin
     if Terminated then Break;
     Form1.Edit1.Text := IntToStr(i);
   end;

  // Если сюда добавить ShowMessage в процессе работы
      программа выдает  ошибку.
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TTestThread.Create(False);
end;


← →
MBo ©   (2008-02-26 09:55) [1]

>Form1.Edit1.Text := IntToStr(i);
так делать нельзя, почитай о Synchronize

>программа выдает  ошибку.
Пошли форме сообщение, чтобы она показала ShowMessage, или Synchronize используй


← →
Сергей М. ©   (2008-02-26 09:56) [2]


> мне нужно что бы после выполнения это кода появилось уведомление
> в виде ShowMessage()


Размести код а-ля ShowMessage(), например, в обработчике события OnTerminate - это очевидное и безопасное в требуемом контексте решение.


> Form1.Edit1.Text := IntToStr(i);


Этот код недопустим в теле Execute, необходима синхронизация (см. метод Synchronize)


← →
Рома....   (2008-02-26 10:06) [3]

Мастера, а так правильно ?

type
 TTestThread = class(TThread)
 protected
   procedure Execute; override;
   procedure GiveAnswer;
 private
   Answer : integer;
 end;

procedure TTestThread.GiveAnswer;
begin
 Form1.Edit1.Text := InttoStr(Answer);
end;

procedure TTestThread.Execute;
var
 I: Integer;
begin
 for I := 1 to 20000 do
   begin
     if Terminated then Break;
     Answer := i;
     Synchronize(GiveAnswer);
   end;
end;


← →
Рамиль ©   (2008-02-26 10:18) [4]

Правильно.


← →
MBo ©   (2008-02-26 10:20) [5]

ну технически - верно, а практически - на каждой итерации переключение потоков бессмысленно, но я так понимаю, что это не реальный код.


← →
Рома....   (2008-02-26 10:26) [6]

Спасиб.

> Размести код а-ля ShowMessage(), например, в обработчике события ?
> OnTerminate - это очевидное и безопасное в требуемом контексте решение.

А OnTerminate это событие чего ? Т.е по прежнему мне не совсем ясно как показать сообщение после выполнения обработки. Подскажите плз.


← →
Сергей М. ©   (2008-02-26 10:32) [7]


> OnTerminate это событие чего ?


Это стандартное событие любого объекта-наследника класса TThread

1. Объяви, например, в классе твоей формы процедурный метод DoOnTerminate с прототипом TNotifyEvent

2. В реализации метода выводи сообщение

3.


procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestThread.Create(True) do
begin
  FreeOnTerminate := True;
  OnTermonate := DoOnTerminate;
  Resume;
end;
end;


← →
Loginov Dmitry ©   (2008-02-26 22:43) [8]

>  // Если сюда добавить ShowMessage в процессе работы
>      программа выдает  ошибку.


Помимо всего сказанного, ты можешь просто заменить ShowMessage() на Windows.MessageBox() - тогда не будет никаких ошибок.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.009 c
2-1203486854
серж
2008-02-20 08:54
2008.03.23
ComboBox


2-1204014098
dracula
2008-02-26 11:21
2008.03.23
ReadFile и юникод


11-1186122972
Alexey_k
2007-08-03 10:36
2008.03.23
Access Violation на компоненте MHIPEdit


2-1204092389
Тимон.
2008-02-27 09:06
2008.03.23
Вопрос по TSQLConnection


2-1203688480
Igor23
2008-02-22 16:54
2008.03.23
Excel




   Наверх