У Delphi-ју, коришћење Sleep функције може узроковати замрзавање корисничког интерфејса. Ако желите да паузирате извршавање без блокирања GUI, можете користити следеће алтернативе:
TTimer – користите komponentu TTimer koja може периодично извршавати код без блокирања главне нити. Конфигуришите вријеме интервала у милисекундама, а када се тимер активира, извршиће се догађај OnTimer .
var
Timer: TTimer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Kod koji želite da izvršite
Timer.Enabled := False; // Isključite timer nakon izvršenja
end;
procedure TForm1.StartTimer;
begin
Timer := TTimer.Create(Self);
Timer.Interval := 1000; // 1 sekunda
Timer.OnTimer := Timer1Timer;
Timer.Enabled := True; // Aktivirajte timer
end;
Thread – ако имате задатак који траје дуже, можете га покренути у новој нити (TThread). Ово ће омогућити да се програм настави да реагује док се задатак извршава у позадини.
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TMyThread.Execute;
begin
// Dugo izvršavanje
Sleep(10000); // Simulacija dugotrajnog procesa
Synchronize(procedure begin
// Ažurirajte UI ovde
end);
end;
Asynchronous Programming – коришћење async/await pristupa (од верзије Delphi 10 Seattle) омогућава асинкроно програмирање, што може бити корисно за неблокирање UI.
procedure TForm1.DoSomethingAsync;
begin
TTask.Run(procedure
begin
Sleep(1000); // Simulacija posla u pozadini
TThread.Synchronize(nil, procedure
begin
// Ažurirajte UI ovde
end);
end);
end;
Све ове методе омогућавају извршавање задатка без замрзавања апликације и одржавање респонсивности корисничког интерфејса.
procedure Delay(msecs: Longint);
// pauza u mili sekundama (zamjena za BP funkciju)
var
FirstTickCount: Longint;
begin
FirstTickCount := GetTickCount; // Win API funkcija (vraca vrijeme u ms od paljenja racunara)
repeat
Application.ProcessMessages;
// dozvoljava pristup drugim kontrolama i procesima dok traje pauza
until ((GetTickCount - FirstTickCount) >= Longint(msecs));
end;