TThreadOracle = class(TThread) { 声明线程类 }
  private
  procedure xxx();     { 测试用函数    }  protected
    procedure Execute; override;{ 执行线程的方法                       }
  public
    constructor Create(); virtual; { 线程构造器 }
  end;function MyThreadfunc():integer;
var
a,i,j:INteger;
begin
 ShowMessage('开始多线程');
//  Gauge2.MaxValue:=100000;
//FProgressbar.Max:=100000;
for i:=0 to 100000 do
  for j:=0 to 100000 do
     a:=i+j;
ShowMessage('结束多线程');Procedure TThreadOracle.Execute;
 begin
 if not Terminated then
 try  XXX();                   { 打开查询 }  except
   Application.MessageBox('线程异常','错误',MB_OK+MB_IconError);
  end; end;Constructor TThreadOracle.Create();
 begin
 inherited Create(True);
 FreeOnTerminate := False; end;//执行操作按钮procedure Tfrm1.btnStartClick(Sender: TObject);
var
Q:TThreadOracle;begin   Q:=TThreadOracle.Create();
   Q.Execute;
   Q.Terminate;
   Q.Destroy;
end;一点start,界面就死,我实在是用了线程,怎么界面还是死呢?!!
到底要我怎样做才不会死界面,或者是说,还能相应其他的消息。

解决方案 »

  1.   

    Q.Execute;
       Q.Terminate;
       Q.Destroy;这几个去掉...
      

  2.   

    你的showMessage()阻塞了线程的执行!
      

  3.   

    var
      frm1: Tfrm1;
      Q:TThreadOracle;procedure Tfrm1.btnStartClick(Sender: TObject);
    begin
      Q:=TThreadOracle.Create();
      Q.Resume;
    end;
    还要用按钮来结束线程,如
    procedure Tfrm1.btnEndClick(Sender: TObject);
    begin
      Q.Suspend;
      Q.Free;
    end;
      

  4.   

    Constructor TThreadOracle.Create();
     begin
     inherited Create(///false);
     FreeOnTerminate := False; end;
      

  5.   

    这样可以吗 ?TThreadOracle = class(TThread) { 声明线程类 }
      private
      procedure xxx();       
      protected
        procedure Execute; override 
      public
        constructor Create(); virtual; 
      end;Procedure MyThreadfunc ;
    var
      a,i,j:INteger;
    begin
      for i:=0 to 100000 do
        for j:=0 to 100000 do
          a:=i+j;
    end ;Procedure TThreadOracle.Execute;
     begin
     if not Terminated then
     try
      XXX();
      MyThreadfunc ;   // 如果 MyThreadfunc 涉及 VCL 用 Synchronize 同步资源                 
      except
       Application.MessageBox('线程异常','错误',MB_OK+MB_IconError);
      end;
    end;Constructor TThreadOracle.Create();
    begin
     inherited Create(False);
     FreeOnTerminate := False;
    end;procedure Tfrm1.btnStartClick(Sender: TObject);
    var
    Q:TThreadOracle;
    begin
      ShowMessage('开始多线程');
      Q:=TThreadOracle.Create(False);
      with Q do
      begin
        if Suspended then Resume;
      end ;
      ShowMessage('结束多线程');
    end;
      

  6.   

    这两句阻塞了你的主线程
       Q.Terminate;
       Q.Destroy;
      

  7.   

    最后,Api函数搞定。揭贴。CreatThread()