我是菜鸟,在线程中对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;

解决方案 »

  1.   

    子线程中不允许画主线程创建的界面,ProgressBar.Visible := True是没有效果,你可以试着在MyFunc中showmessage(''),会有报错提示。
    建议在线程中给主线程发消息,然后主线程接收到消息后对界面进行操作。
      

  2.   


    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;
      

  3.   

    你操作VCL的时候,已经有异常了 
      

  4.   

    你的MyThreadFunc执行完就结束了,我觉得没必要去CLOSEHANDLE直接按下面的试试:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadID:DWord;
    begin
       CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
    end;
      

  5.   

    问题不在于CLOSEHANDLE, 你创建了线程,分配了一个内核,怎么可能不释放
    你在线程里操作VCL对象就弹出异常了
    function MyThreadFunc(P:thandle):Longint;stdcall;
    begin
     with form1 do
     begin
       try
         ProgressBar1.Visible:=true;
       finally
          输出 SysErrorMessage(GetLastError);
       end;
     end;
    end;