Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки [D7, XP]


Рома.... ©   (2008-02-26 09:52:00) 

Помогите разобраться. Я написал небольшой код который работает в потоке, мне нужно что бы после выполнения это кода появилось уведомление в виде 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;


Loginov Dmitry   (2008-02-26 22:43:00) [1]

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


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


Сергей М.   (2008-02-26 10:32:00) [2]


> 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;


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

Спасиб.

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

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


MBo   (2008-02-26 10:20:00) [4]

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


Рамиль   (2008-02-26 10:18:00) [5]

Правильно.


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

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

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 09:56:00) [7]


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


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


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


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


MBo   (2008-02-26 09:55:00) [8]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо