Главная страница
    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.01 c
15-1202580316
В,алекс
2008-02-09 21:05
2008.03.23
Виста / D7


15-1202903455
Ega23
2008-02-13 14:50
2008.03.23
Кто с OpenOffice плотно работал?


15-1202657329
No_Dead
2008-02-10 18:28
2008.03.23
«Пиратское» железо%)


2-1203507273
uno-84
2008-02-20 14:34
2008.03.23
Какой выбрать элемент


15-1202892081
Ega23
2008-02-13 11:41
2008.03.23
Просьба типа вчерашней





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