下面是一个线程的代码,作用是从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.
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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货