本帖最后由 chenjiaye000 于 2012-07-24 15:48:02 编辑

解决方案 »

  1.   

    Form1.Hide和Form2.Show是访问了界面的,需要同步到主线程执行!
    用TThread类吧,有个小例子:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        FMyThread: TThread;
        procedure DoMyTerminateEvent(Sender: TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}type
      TMyThread = class(TThread)
        procedure Execute; override;
        procedure DoIt;
      end;{ TMyThread }procedure TMyThread.DoIt;
    begin
      ShowMessage('线程执行中...');
    end;procedure TMyThread.Execute;
    begin
      inherited;
      //线程中执行的代码,如果访问界面,就需要同步到主线程:
      Synchronize(DoIt);
    end;{ TForm1 }procedure TForm1.DoMyTerminateEvent(Sender: TObject);
    begin
      ShowMessage('线程终止');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FMyThread := TMyThread.Create(True);
      FMyThread.OnTerminate := DoMyTerminateEvent;
      FMyThread.Resume;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FMyThread.Free;
    end;end.
      

  2.   

    研究API建立線程,這有完整的教程http://www.cnblogs.com/del/category/174761.html
      

  3.   


    为什么我个人觉得用TThread类好像比API难?
      

  4.   


    那个Synchronize我查了一下词典是同步的意思。你的意思是说,Form2.show这类代码要用这个函数来运行吗?FMyThread.OnTerminate := DoMyTerminateEvent; 这个是用来只是线程终止事件的吧?
      

  5.   


    我根据你提供的代码,添加了自己的测试代码进行了测试。发现了一个问题。测试代码:procedure TMyThread.Execute;
    var
      i:integer;
    begin
      inherited;
      //线程中执行的代码,如果访问界面,就需要同步到主线程:
      for i:=0 to 500000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(100, 100, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
      Synchronize(DoIt);
    end;
    当线程启动之后、未结束之前,如果我点击关闭程序,界面是关闭了,但实际上程序仍然在内存中继续运行,只有等到线程完成之后程序才能完全退出。想请问一下,我们不是已经使用了procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FMyThread.Free;
    end;吗?这个问题该如何解决?
      

  6.   


    您好!我将Form2.Show;写入procedure TMyThread.DoIt;中,可是已经是运行了Form2的代码,却不显示窗体