constructor TTestThread.Create(CreateSuspended: Boolean;Edit: TEdit);
begin
  FreeOnTerminate := true;
  FEdit := Edit;
  inherited Create(CreateSuspended); //inherited Create(False)会马上调用Execute
end;对Edit1操作时要进行同步控制.如用TThreadList.Add(Edit1) /Lock; /Unlock;
或:
procedure TTestThread.SetText;
begin
  PostMessage(FEdit.Handle, WM_Char, 0, Integer(Pointer(PChar(IntToStr(FValue))));
  //not SendMessage
end;

解决方案 »

  1.   

    to:copy_paste(木石三) Synchronize(SetText); //这句的功能不就是同步吗?为什么还需要另外写代码?  
      

  2.   

    你那说的是在线程中同步,你启动一个线程不会错,而多个会出现对象访问的冲突.
    具体我说不清,对不是在线程生成的对象,而是引用的对象,要考虑它的线程安全,用(TThreadList, TSimpleEvent,etc)
      

  3.   

    to:copy_paste(木石三) 老兄再帮忙指点一二,我修改成:PostMessage后,按一下按钮就没反应了。
    老兄能否简单介绍一下TThreadList的用法。
      

  4.   

    type
      TTestThread = class(TThread)
      private
        { Private declarations }
        FEdit : TEdit;
        FValue : Integer;
        procedure Lock;
        procedure UnLock;
      protected
        procedure Execute; override;
        procedure SetText;
      public
        constructor Create(CreateSuspended: Boolean;Edit: TEdit);
      end;implementation{ TTestThread }procedure TTestThread.Execute;
    var
      i : Integer;
    begin
      { Place thread code here }
      i := 0;
      while true do
      begin
          i := i + 1;
          FValue := i;
          Synchronize(SetText);
      end;
    end;constructor TTestThread.Create(CreateSuspended: Boolean;Edit: TEdit);
    begin
       FreeOnTerminate := true;
       FEdit := Edit;
       FLock := TThreadList.Create;
       FLock.Add(FEdit);
       inherited Create(CreateSuspended);
    end;
    procedure TTestThread.Lock;
    begin
      FLock.Lock;
    end;procedure TTestThread.UnLock;
    begin
      FLock.Unlock;
    end;
    procedure TTestThread.SetText;
    begin
      Lock;
      try
        FEdit.Text := IntToStr(FValue);
      finally
        Unlock;
      end;
    end;end.我在网吧上的网,无法调试,大概是这样.
    如果不用FLock: TThreadList,只改这个:procedure TTestThread.SetText;
    begin
      PostMessage(FEdit.Handle, WM_Char, 0, Integer(Pointer(PChar(IntToStr(FValue))));
      //not SendMessage
    end;
      

  5.   

    不对是TForm1
    TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button5: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
      private
        FLock: TThreadList;
        procedure Lock;
        procedure UnLock;
        { Private declarations }
      public
        { Public declarations }
      end;FLock := TThreadList.Create放在TForm.OnCreate中procedure TForm1.Lock;
    ...
    procedure TForm1.UnLock;
    ...你不如在做一TFOrm1的方法
    procedure TFOrm1.Change(Value: Integer);
    begin
      Lock;
      try
        Edit1.Text := inttoStr(Value);
      finally
        Unlock;
      end;
    end然后由线程来调用Form1.Change(FValue);
    procedure TTestThread.Execute;
    var
      i : Integer;
    begin
      { Place thread code here }
      i := 0;
      while true do
      begin
          i := i + 1;
          FValue := i;
          Form1.Change(FValue);
      end;
    end;
      

  6.   

    to:copy_paste(木石三) 
    TThreadList没有Lock和Unlock这两个函数,我改成LockList和UnlockList后,结果还是一样,
    如果有时间,帮忙再看看,不过你在网吧,非常感谢了。
      

  7.   

    ok,果然delphi高手多,问题解决了,结账,非常感谢,其实我对delphi一点都不熟,这道题我是在bcb中提出来的,好久没人回答,才写了一个delphi的程序,贴过来的。