![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки [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 используй