Page 1 of 1
Forum

Welcome to the Tweaking4All community forums!
When participating, please keep the Forum Rules in mind!

Topics for particular software or systems: Start your topic link with the name of the application or system.
For example “MacOS X – Your question“, or “MS Word – Your Tip or Trick“.

Please note that switching to another language when reading a post will not bring you to the same post, in Dutch, as there is no translation for that post!



Share:
Notifications
Clear all

Lazarus Pascal - How to make a Delay/Sleep without locking up your application

2 Posts
1 Users
0 Likes
5,175 Views
 Hans
(@hans)
Famed Member Admin
Joined: 9 years ago
Posts: 2236
Topic starter  

So I had to add a delay (better said: sleep) in my code, so that after displaying a temporary status message, would revert back to it's previous message. Kind-a like a brief bleep showing a notification and then going back to where we left off.

Now the sleep() function has a little problem ... it's totally locks your application (Zzz mouse, or spinning ball) and the user can't really do anything.

With a neat little trick you can do this better;

procedure MyDelay(DelayTickCount: DWORD);
  var
    StartTickCount : DWORD;
  begin
    StartTickCount := GetTickCount;
    while (GetTickCount < StartTickCount + DelayTickCount) and (not Application.Terminated) do
      Application.ProcessMessages;
  end;   

So this function does NOT lock you user interface, but does wait with the next steps for "DelayTickCount" milliseconds.


ReplyQuote
 Hans
(@hans)
Famed Member Admin
Joined: 9 years ago
Posts: 2236
Topic starter  

Since the previous functions uses GetTickCount, which has its issues and GetTickCount64 appears a better choice, you may also want to consider the alternative below, which uses TDateTime instead, where we can set out delay in milliseconds (1000=1sec).

Note: uses the dateutils unit.

procedure MyDelay(milliSecondsDelay: int64);
var
  stopTime : TDateTime;
begin
  stopTime := IncMilliSecond(Now,milliSecondsDelay);
  while (Now < stopTime) and (not Application.Terminated) do
    Application.ProcessMessages;
end;

ReplyQuote
Share: