下面是一个线程的代码,作用是从Server端接受数据并动态显示在fctreeView控件上,线程中间运行过程一直正确,但是在执行最后更新的语句Synchronize(UpdateNodes)时总是更细不了,fctreeview控件没有反应,跟踪了一下是在执行
      for i := 1 to FNodeCount do
      begin        Node := frmMain.fctreeVwClientList.Items.Add(FNode,DriveList.Strings[i]);
        Node.StringData := DriveType.Strings[i];
    
       end;
出现错误,在主界面上放上一个按钮写入显示更新代码fctreeview显示正常;另外使用Synchronize方法在线程中无法更新TImage控件中的图像。
编译化境为indy10,Delphi2009,1stClass for delhpi2009,Win2003uses
  Classes,fcTreeView,SysUtils,idTcpClient,idcomponent,IdGlobal,Dialogs,Windows    ;type
  TDownFolderThread = class(TThread)
  private
    { Private declarations }
    FIP : string ;
    FRootDir : string ;
    FPort : Integer ;
    FNode : TfcTreeNode ;    FTcpClient : TIdTCPClient ;
    FDriveList : TStringList;
    FDriveType : TStringList ;
    FNodeCount : Integer ;
  protected
    procedure Execute; override;
  public
    constructor Create(Ip : string ;Port : string;RootDir : string;var Node : TfcTreeNode );
    destructor Destroy();override;
    procedure UpdateNodes;
  end;implementationuses CommDefs, frmMainU;
procedure TDownFolderThread.Execute;
var
  i : integer ;
  CMDStr : string ;
begin //开始接受数据
 try
   FTcpClient.Host := FIP;
   FTcpClient.Port := FPort ;
   FTcpClient.ConnectTimeout := ConnectionTimeOut ;
   FTcpClient.ReadTimeout := ConnectionTimeOut ;
   FTcpClient.Connect ;
   FTcpClient.IOHandler.ReadLn();
   if FRootDir='.' then
     CMDStr :=  CMDGetDrives
   else
     CMDStr := CMDGetFolder+CMDDelimiter+FRootDir;   FTcpClient.IOHandler.WriteLn(CMDStr,AllEnCoding );
   FNodeCount := StrToInt(FTcpClient.IOHandler.ReadLn(AllEnCoding ) );
   for i := 1 to FNodeCount do
   begin
     FDriveList.Add(FTcpClient.IOHandler.ReadLn(AllEnCoding ) );
     FDriveType.Add(FTcpClient.IOHandler.ReadLn(AllEnCoding ) );
   end;
   Synchronize(UpdateNodes);
 except
   FTcpClient.Disconnect ;
 end;
   FTcpClient.Disconnect ;
end;
constructor TDownFolderThread.Create(Ip : string ;Port : string;RootDir : string;var Node : TfcTreeNode );
begin
   inherited Create(False);
   FIP := Ip;
   FPort := StrToInt(Port);
   FRootDir := RootDir  ;
   FNode := Node ;
   FTcpClient := TIdTCPClient.Create(nil);
   FDriveList := TStringList.Create ;
   FDriveType := TStringList.Create ;
   FreeOnTerminate := True ;
end;
destructor TDownFolderThread.Destroy();
begin
   FTcpClient.Disconnect ;
   FreeAndNil(FTcpClient);
   FDriveList.Free ;
   FDriveType.Free ;
   inherited Destroy;
end;
procedure TDownFolderThread.UpdateNodes;
var
  i : Integer ;
  Node : TfcTreeNode ;
begin
  frmMain.fctreeVwClientList.Items.BeginUpdate ;
      for i := 1 to FNodeCount do
      begin        Node := frmMain.fctreeVwClientList.Items.Add(FNode,DriveList.Strings[i]);
        Node.StringData := DriveType.Strings[i];
    
       end;
  frmMain.fctreeVwClientList.Items.EndUpdate ;
end;
end.