在线程中创建窗体时,为什么会出这个异常?Canvas does no allow drawing
源码如下:
TAboutBox为从TForm继承的类(模版里面的)  TTestWin = class(TThread)
  protected
    procedure Execute; override;
  public
    hWin: THandle;
  end;
procedure TTestWin.Execute;
var
  msg: TMsg;
  frm: TAboutBox;
begin
  FreeOnTerminate := true;
  sleep(500);
  frm := TAboutBox.Create(nil);
  hWin := frm.Handle;
  frm.Show;
  while GetMessage(msg,0,0,0) do
  begin
    DispatchMessage(msg);
  end;
  frm.Free;
end;这样创建线程时,线程里面TAboutBox.Create(nil)会有一个异常Canvas does no allow drawing
procedure TForm1.Button5Click(Sender: TObject);
var
  thr: TTestWin.Execute;
begin
  thr: := TTestWin.Create(flase);
end;
但是跟踪代码时就没错了,如果这样调用也没有错
procedure TForm1.Button5Click(Sender: TObject);
var
  thr: TTestWin.Execute;
begin
  thr: := TTestWin.Create(true);
  sleep(10);
  msgThread.Resume;
end;线程中TAboutBox.Create(nil)之前加sleep也不行。
但是将TAboutBox换成TForm就可以了。真是怪。

解决方案 »

  1.   

    可将代码改为
    unit Unit2;interface
    uses
      Classes,Windows,Forms;
    type
      TTestWin = class(TThread)
      protected
        procedure Execute; override;
      public
        hWin: THandle;
        constructor create;
        procedure doit;
      end;
    implementationuses
      Unit1;
      
    constructor TTestWin.create;
    begin
      inherited Create(False);
    end;procedure TTestWin.doit;
    var
        frm: TAboutBox;
        msg: Tmsg;
    begin
      frm := TAboutBox.Create(nil);
      frm.Show;
        while GetMessage(msg,0,0,0) do
      begin
        DispatchMessage(msg);
      end;
      frm.Free;
    end;procedure TTestWin.Execute;
    var
      msg: TMsg;begin
      FreeOnTerminate := true;
      sleep(500);
      Synchronize(doit);
      sleep(10000);
    end;
    end.在线程中处理VCL控件需Synchronize()