在线程中创建窗体时,为什么会出这个异常?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就可以了。真是怪。
源码如下:
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就可以了。真是怪。
解决方案 »
- delphi创建虚拟硬盘的问题
- TreeView多层怎么创建啊?
- 熊猫烧香!你烧的是哪一炷香?是祈祷CodeGear在新的一年大展宏图?
- 求救:FastReport分组换页问题
- 关于两个 ClientDataSet 实现lookup形式的问题
- [Warning] Unit1.pas(394): Unsafe type 'PChar' 望高手指点
- 那位大侠,教我怎么样在DELPHI中表示一个内存地址。
- 请问怎么样form 一运行的时候就是全屏?(在线等)
- Delphi 中可以操纵 SHEll 吗?
- 在一个过程中我ADODataSet.Open了,那出这个过程的时候会自动Close吗?
- 有何实现从网络路径copy文件到本地磁盘?
- 一个简单的问题!
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()