'Display image using Windows API

I am using a looping primitive code to output a test image:

procedure TForm1.Button1Click(Sender: TObject);
var
  LP1, LP2: TLogPen;
  hp1, hp2: THandle;
  hdcv: Handle;
  i: integer;
begin
  LP1.lopnColor:=$FF0000;
  LP1.lopnStyle:=0;
  LP1.lopnWidth:=Classes.Point(1,0);
  LP2.lopnColor:=$FFFFFF;
  LP2.lopnStyle:=0;
  LP2.lopnWidth:=Classes.Point(1,0);
  hp1:=Windows.CreatePenIndirect(Windows.LOGPEN(LP1));
  hp2:=Windows.CreatePenIndirect(Windows.LOGPEN(LP2));

  hdcv:=Canvas.Handle;
  for i:=1 to 1000 do
    begin
      SelectObject(hdcv, hp1);
      Windows.MoveToEx(hdcv, 10+2*i, 10, nil);
      Windows.LineTo(hdcv, 50+2*i, 50);
      Sleep(100);
      Application.ProcessMessages;
      SelectObject(hdcv, hp2);
      Windows.MoveToEx(hdcv, 10+2*i+1, 10, nil);
      Windows.LineTo(hdcv, 50+2*i+1, 50);
      Sleep(100);
      Application.ProcessMessages;
    end;

  Windows.DeleteObject(hp1);
  Windows.DeleteObject(hp2);
end;

The problem is that when the mouse is on the button (Button1), lines output is intermittent. As if drawing takes place in some kind of buffer, and after some time it is displayed on the form. I recorded a video. I am using Windows 7 and Lazarus 1.6.4. Can someone explain this graphics behavior?



Solution 1:[1]

During the sleep, windows repaint messages can't operate. So it is possible that the repaint only happens on the processmessages stage.

The best solution is to rewrite this asynchronously using a timer.

To test the hypothesis you could replace the sleep-application.processes with a more fine grained solution like

So instead of

 sleep(100);   
 Application.ProcessMessages;

we replace it with

for y:=1 to 10 do
 begin
   sleep(10);
    Application.ProcessMessages;
 end;

Somewhat nicer is a solution like this (pseudocode only):

 startticks:=gettickcount64; // startticks = int64
 while (gettickcount64-startticks)<100 do
    begin
      sleep(10);
      Application.ProcessMessages;
    end;

which accounts better for the time spent in Application.Processmessages.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marco van de Voort