我是菜鸟,在线程中对ProgressBar操作时,当ProgressBar初始visible属性为false,而在线程中设置它的visible为true;则执行完线程后关闭窗口会提示句柄无效,这是为什么啊?
代码如下:
function MyThreadFunc(P:thandle):Longint;stdcall;
begin
with form1 do
begin
ProgressBar1.Visible:=true;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hThread:Thandle;
ThreadID:DWord;
begin
try
hThread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
finally
if hthread<>0 then closehandle(hthread);
end;
end;
代码如下:
function MyThreadFunc(P:thandle):Longint;stdcall;
begin
with form1 do
begin
ProgressBar1.Visible:=true;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hThread:Thandle;
ThreadID:DWord;
begin
try
hThread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
finally
if hthread<>0 then closehandle(hthread);
end;
end;
解决方案 »
- 如何制作始终位于最后的窗体
- 如何读取和修改XML的节点的值,哪位给一段代码学习?
- 关于TREEVIEW的问题
- 如何迁移DELPHI环境至另一台机
- 关闭在次打开就不在显示此窗体了?
- 实在改不了这个错误,那为高手给予指点指点。
- 请教一个用InstallShield for delphi5做安装程序出错的问题!
- 查询结果显示格式定义怎么设置呀?即把select查询的数据0.250000显示成25%或者1/4 的问题
- 是我出的分数太低,还是问题太简单,怎么没人帮助我。
- 数据库中word2010取出并打开问题
- timer过程内的idhttp.get第二次运行时,取不到数据???
- 如何正常的关闭一个进程,如迅雷等
建议在线程中给主线程发消息,然后主线程接收到消息后对界面进行操作。
const
Wm_MyMsg = WM_USER + 1000;procedure WmMyMsg(var message: Tmessage); message Wm_MyMsg;procedure TForm1.WmMyMsg(var message: Tmessage);
begin
ProgressBar1.Visible:=true;
end;function MyThreadFunc(P:thandle):Longint;stdcall;
begin
with form1 do
begin
PostMessage(Handle, Wm_MyMsg, 0, 1);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID:DWord;
begin
closehandle(CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ThreadID:DWord;
begin
CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
end;
你在线程里操作VCL对象就弹出异常了
function MyThreadFunc(P:thandle):Longint;stdcall;
begin
with form1 do
begin
try
ProgressBar1.Visible:=true;
finally
输出 SysErrorMessage(GetLastError);
end;
end;
end;