Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
Рома....   (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 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
4-1178650355
Strate
2007-05-08 22:52
2008.03.23
Опять ListView, изменение колонки.


2-1203653408
DelphiN!
2008-02-22 07:10
2008.03.23
Не выполняется SQL


15-1202828471
Koha_San
2008-02-12 18:01
2008.03.23
BDS 2007 на фрейм ворк какой версии, 2-й или 1-й


15-1202485817
Blind Guardian
2008-02-08 18:50
2008.03.23
Про динамические массивы


6-1183235019
TNMNNTP
2007-07-01 00:23
2008.03.23
TNMNNTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский