![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Простейшая задачка с одним потоком: на форме две кнопки. При нажатии одной из них форма должна начать "таять" вплоть до растворения. Если во время этого процесса нажимается вторая кнопка, то процес таяния должен прерваться и форма должна обрести полную видимость. Процесс таяния организую в поток:
Код:
type
TIceThread = class(TThread)
private
protected
procedure DoThawing;
procedure Execute; override;
end;
TFMain = class(TForm)
cxButton1: TcxButton;
cxButton2: TcxButton;
procedure cxButton1Click(Sender: TObject);
procedure cxButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FMain: TFMain;
IceThread: TIceThread;
implementation
{$R *.dfm}
//===============================================
procedure TIceThread.Execute;
begin
Synchronize(DoThawing);
end;
//=================================
procedure TIceThread.DoThawing;
var i: double;
begin
i := 255;
while not Terminated and (FMain.AlphaBlendValue > 0) do
begin
i := i - 0.00001;
FMain.AlphaBlendValue := trunc(i);
end;
Fmain.Close;
end;
//================================
procedure TFMain.cxButton1Click(Sender: TObject);
begin
if (IceThread <> nil) and not IceThread.Terminated then
begin
IceThread.Terminate;
FMain.AlphaBlendValue := 255;
end;
end;
//===========================================
procedure TFMain.cxButton2Click(Sender: TObject);
begin
IceThread:=TIceThread.Create(true);
IceThread.FreeOnTerminate:=true;
IceThread.Priority:=tpLower;
IceThread.Resume;
end;
//================================ |
|
#2
|
|||
|
|||
|
Алё-о-о! Лю-у-у-ди-и-и! Вы меня слышите?
|
|
#3
|
||||
|
||||
|
Предполагаю, что процедура procedure TIceThread.DoThawing; работает самостоятельно - независимо от потока, поскольку цикл запускается не в потоке (OnExecute), а в самой процедуре, и получается так, что поток запущен, и он не остановится, пока не выполнит процедуру. Вот этот цикл:
Код:
i := 255;
while not Terminated and (i > 0) do
begin
i := i - 0.00001;
Synchronize(Ice);
end;Код:
Procedure TIceThread.Ice; Begin FMain.AlphaBlendValue := trunc(i); End; Кстати, по таймеру растворять форму гораздо легче. |
|
#4
|
|||
|
|||
|
Дельфийский Мозг, спасибо Вам огромное! Очень доступно и понятно. Теперь хоть немного въехала в формулу общения с потоками. А счетчиковая переменная типа Double только потому что меня дельфийские монстры учили не использовать sleep без лишней необходимости
![]() Вот, по ходу, ещё вопросы возникли: 1. Правильно ли я понимаю, что все процедуры, которые внутри потоковой OnExecute, надо синхронизировать? 2. Если у меня поток FreeOnTerminate :=- true, то никаких дополнительных действий не надо выполнять при завершении программы? Последний раз редактировалось vikk, 23.01.2012 в 10:46. |
|
#5
|
|||
|
|||
|
Цитата:
Синхронизировать нужно те куски кода, которые обращаются к элементам интерфейса - что-нибудь рисуют на форме или как нибудь меняют состояния контролов. Если окажется, что всё содержимое OnExecude окажется внутри Synchronize, то стоит подумать, а нужен ли здесь поток. |