1、我运行了两个线程对使用一个全局变量进行了修改,但好像没反映。
  2、如何判断线程已结束。

解决方案 »

  1.   

    1。tcriticalsection同步多线程对共享资源的访问。
    2。thread.terminated
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyThread = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      public
        constructor Create(Suspended: Boolean);
      end;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      gQuery: Integer;implementation{$R *.dfm}constructor TMyThread.Create(Suspended: Boolean);
    begin
      inherited Create(Suspended);
      FreeOnTerminate:= True;
    end;procedure TMyThread.Execute;
    begin
      FreeOnTerminate:= True;
      gQuery:= 1;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      testThread: TMyThread;
    begin
      testThread:= TMyThread.Create(False);
      showmessage(inttostr(gQuery));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      gQuery:= 0;
    end;end.
    我想返回的结果是1,但返回的结果仍为0
      

  3.   

    在showmessage前加上sleep(5);就行了。既:
    把你的按纽事件中procedure TForm1.Button1Click(Sender: TObject)
    改为
    testThread:= TMyThread.Create(False);
    sleep(5); //加上就行了
    showmessage(inttostr(gQuery));
      

  4.   

    procedure TMyThread.Execute;
    begin
      FreeOnTerminate:= True;  // 这句有必要吗?
      gQuery:= 1;
    end;对于第二个问题
    判断线程结束
    定义函数procedure OnThreadTerminate(Sender: TObject);
    再其中写上线程终止后要做什么
    在创建线程时 记得要testThread.Onterminate := OnThreadTerminate;
      

  5.   

    我是过了,是可以的testThread:= TMyThread.Create(False);
    你加这么句看看,
    testthread.Resume;  showmessage(inttostr(gQuery));
      

  6.   

    procedure TMyThread.Execute;
    begin
      FreeOnTerminate:= True;
      gQuery:= 1;
      over:=true;////////////////judgement!
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      testThread: TMyThread;
    begin
      testThread:= TMyThread.Create(False);
      repeat
       ...../////some codes that not important
      until(over=true)
      showmessage(inttostr(gQuery));
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      gQuery:= 0;
      over:=false;
    end;
    ///这样应该可以,但太浪费CPU时间了。。
      

  7.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      testThread: TMyThread;
    begin
      testThread:= TMyThread.Create(False);
    testthread.Execute;
      showmessage(inttostr(gQuery));
    end;
    你试试!!我试过,很理想!!!
      

  8.   

    procedure TMyThread.Execute;
    begin
      FreeOnTerminate:= True;  //在运行完后自动结束,非常有必要。
      Onterminate := OnThreadTerminateend;
    end;procedure OnThreadTerminate(Sender: TObject);
    begin
    end;