type
  TTest=class(TThread)
  private
    procedure TTest_value;
  public
     Id     : integer;
  protected
    procedure Execute; override;
  end;
var
  Form1: TForm1;implementation{$R *.dfm}
procedure TTest.TTest_value;
begin
id:=id+1;
showmessage(inttostr(id));))//显示ID老是为1
end;procedure TTest.Execute;
begin
Synchronize(TTest_value);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
dd: TTest ;
begin
dd:=TTest.Create(true);//ID 值为1
dd.Resume;
dd:=TTest.Create(true);//ID还是为1 本来是想让他在这儿加1,即为2
dd.Resume;
end;看看是哪儿错了,显示ID总是为1不知道怎么办了。

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    dd: TTest ;
    begin
    dd:=TTest.Create(true);//ID 值为1
    //dd.Resume;
    //dd:=TTest.Create(true);//这里又创建一个线程了,当然ID为1dd.Resume;
    end;
      

  2.   

    你又重新创建了一个线程,当然是1了.如果想变成2就应该在一个线程里让它加一.而且你也没有写EXCECUTE.
      

  3.   

    procedure TTest.Execute;
    begin
    Synchronize(TTest_value);//因为你这句只执行了一次。
    end;改为:
    procedure TTest.Execute;
    var i:integer;
    begin
    for i:=1 to 5000 do
    Synchronize(TTest_value);//这样可以循环5000次。
    end;还有你所说的ID为ttest的私有成员变量。
    每个ttest对象一个。
    你建立了两个ttest对象,所以它们的ID都为默认值。dd:=TTest.Create(true);//ID 值为1
    dd.Resume;
    dd:=TTest.Create(true);//ID还是为1 本来是想让他在这儿加1,即为2这样用有可能发生问题,当线程退出时。如果线程对象没有释放。可能发生内存丢失。