canvas does not allow drawing 错误的形成主要是绘图还未完成,函数或程序就已经退出,这种错误常常出现于多线程设计中,人们往往只关注主线程结束时其他线程是否结束了工作,而有的时候一个线程内的操作还未结束,线程就结束了,就会出现这个问题,举个例子大家来琢磨琢磨吧~~~
有问题的程序:
procedure fun1();
procedure fun2();var
Form1: TForm1;
handle1,handle2: THandle;
dw1,dw2: Cardinal;
r: Cardinal;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
handle1 := CreateThread(nil,0,@fun1,nil,0,dw1);
handle2 := CreateThread(nil,0,@fun2,nil,0,dw2); CloseHandle(handle2);
end;procedure fun1();
begin
while(1=1)do
begin
end;
end;procedure fun2();
begin
r:= WaitForSingleObject(handle1,1000);
ShowMessage('sssss');///////////这里出错了!!!!
CloseHandle(handle1);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
TerminateThread(handle1,4);
end;end.
当按钮按下时,程序出错了,原因就是showmessage还未来得急绘制线程2就结束了
ShowMessage('sssss');
Sleep(1000);这样看看,问题“解决”了,就是这样。
有问题的程序:
procedure fun1();
procedure fun2();var
Form1: TForm1;
handle1,handle2: THandle;
dw1,dw2: Cardinal;
r: Cardinal;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
handle1 := CreateThread(nil,0,@fun1,nil,0,dw1);
handle2 := CreateThread(nil,0,@fun2,nil,0,dw2); CloseHandle(handle2);
end;procedure fun1();
begin
while(1=1)do
begin
end;
end;procedure fun2();
begin
r:= WaitForSingleObject(handle1,1000);
ShowMessage('sssss');///////////这里出错了!!!!
CloseHandle(handle1);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
TerminateThread(handle1,4);
end;end.
当按钮按下时,程序出错了,原因就是showmessage还未来得急绘制线程2就结束了
ShowMessage('sssss');
Sleep(1000);这样看看,问题“解决”了,就是这样。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货