|
|
Регистрация | << Правила форума >> | 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, то стоит подумать, а нужен ли здесь поток. |