从线程

时间:2017-05-31 09:24:20

标签: multithreading delphi canvas drawing delphi-xe7

我在Desktop的画布上绘制了这段代码:

procedure Paint;  {Pseudo code}
begin
 repeat
   DrawOnWindow();
   sleep(100);
   Application.ProcessMessages;
 until;
end;

function DrawOnWindow(Handle: HWND; X, Y: Integer; BMP : TBitmap): Boolean;
{ actual code }
var
   Canvas  : TCanvas;
   DC : HDC;
begin
 Result:= FALSE;                                                            
 Assert(Handle > 0);      // if change is possible then
 try
  DC := GetDC(Handle);    // the dc is freed after repainting
  Canvas := TCanvas.Create;    
  Canvas.Handle := DC;
  Canvas.Draw(x, y, bmp);   
  Canvas.Free;
  Result := TRUE;
  ReleaseDC(Handle,DC);
 except
 end;
end;

绘图工作正常。但它冻结了我的程序,我不得不使用Application.ProcessMessages来“解冻”它。但Application.ProcessMessages正在创建自己的问题。

所以我在一个帖子中移动了代码。现在它可以工作一段时间(< 1分钟),然后画布不再被绘制(但线程正在运行)。

  1. 为什么会这样?我应该锁定画布吗?
  2. 另一个问题(路径)是:我应该在主app / thread中移回绘画代码并从TTimer(或更好,高精度计时器)绘制?

0 个答案:

没有答案