Вниз
Скачать: 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-1203870038
Igor23
2008-02-24 19:20
2008.03.23
ExcelXP


6-1182958151
апвып
2007-06-27 19:29
2008.03.23
WebBrowser


2-1203495233
Dymok
2008-02-20 11:13
2008.03.23
Как обратиться к объекту на другой форме в нестандартном случае?


15-1202669039
NaRuTo
2008-02-10 21:43
2008.03.23
Вхождение в другой компьютер!


15-1202578961
kiber-pilot
2008-02-09 20:42
2008.03.23
Список замен




   Наверх