Форум: "Начинающим";
Текущий архив: 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