以下是我自己写的MyThread.pas ,运行时出现了两个问题:
  1.程序执行到Synchronize(InitEdit);就停在此处不动作了!
  2.若把Synchronize(InitEdit);注释掉,则界面上的Edit内容没有任何改变。请各位告知,先谢了! 
unit MyThread;//MyThread.pasinterfaceuses
  Windows, SysUtils,Classes,StdCtrls,Dialogs;type
  TMyThread = class(TThread)
  private
    { Private declarations }
    ED:TEdit;
    procedure InitEdit;      //初始化Edit
    procedure UpdateEdit;  //修改Edit
  protected
    procedure Execute; override;
  published
    constructor CreateIt(ED:TEdit);
    destructor Destroy;override;
  end;implementationconstructor TMyThread.CreateIt(ED:TEdit);
begin
   inherited Create(false);
   FreeOnTerminate := true;   Synchronize(InitEdit);-------1.执行到此句出错,程序停在此处不动作了!   Suspended:=false;
end;
//--------------------------------------------------------------------
procedure TMyThread.InitEdit;   //初始化Edit
begin
   ED.Text:='';
end;
//--------------------------------------------------------------------
procedure TMyThread.UpdateEdit;  //修改Edit
var CostTime:integer;
    StartTicker,EndTicker:integer;
    i,j:integer;
begin    StartTicker := GetTickCount;
    i:=0;
    for i:=0 to 1000 do
    begin
        CostTime:=GetTickCount-StartTicker;
        ED.Text:=IntToStr(CostTime);------2.此处出错!
                   //为何界面上的Edit1的内容没有任何改变?
    end;end;
//--------------------------------------------------------------------
procedure TMyThread.Execute;
begin
  Synchronize(UpdateEdit);end;
//--------------------------------------------------------------------
destructor TMyThread.Destroy;
begin
   PostMessage(Form1.Handle,wm_ThreadDoneMsg,self.ThreadID,0);
   inherited destroy;
end;end.

解决方案 »

  1.   

    你的Ed是动态创建的还是别的窗体上的?如果是其他窗体上的直接操作当然不行ED.Text:=IntToStr(CostTime);
      

  2.   

    我看你的意思,是在CreateIt的时候,把ED传到线程里面来,但是你在CreateIt构建过程里面,完全就不理会ED的传入。而你在InitEdit里面用到的ED则是一个没有创建的TEdit的对象变量而已,你当然会出错。在这里,对象的成员变量和过程的局部参数变量,我想你是搞混淆了。在CreateIt里面增加一句:Self.Ed := ED;差不多就应该可以了。还有就是,你的这个线程其实没有什么用,所有的操作都放在Synchronize里面进行,也就是说都是附着在主线程里面进行的,这就和单线程没有任何的差别,这样的话,就不必要用多线程来去做了。
      

  3.   

    谢谢 hellolongbin(一个人) 和zeroxing(光头)的回答 !!!TO zeroxing(光头) :按你的提示我修改了变量ED,也试过Self.Ed := ED,
    程序还是停在Synchronize(InitEdit);就不动作了,请再帮我看看吧!谢谢!type
      TMyThread = class(TThread)
      private
        { Private declarations }
        ED_T:TEdit;*********增加了对象的成员变量**********
        procedure InitEdit
        procedure UpdateEdit;  
      protected
        procedure Execute; override;
      published
        constructor CreateIt(ED:TEdit);***过程的局部参数变量保持不变***
        destructor Destroy;override;
      end;implementation
    uses Unit_TwoThread;
    //------------------------------------------------------------------------------
    constructor TMyThread.CreateIt(ED:TEdit);
    var  a1:String;
    begin
       inherited Create(true);
       FreeOnTerminate := true;
       a1 := ED.Text;---------------当程序执行到此处,a1='Edit1';说明参数传递成功了。
       ED_T := ED;
       Synchronize(InitEdit););-----但执行到此句,程序仍停在此处不动作了!
       Suspended:=false;
    end;
    //------------------------------------------------------------------------------
    procedure TMyThread.InitEdit;   //初始化Edit
    begin
       ED_T.Text := '11';
    end;