idtcpserver 造成界面无响影?(100分)

  • 主题发起人 主题发起人 wealsh
  • 开始时间 开始时间
W

wealsh

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端主界面有idtcpserver和listview,当客户端连接时在listview中添加该客户机的IP,为什么主界面会无响影?断开连接才正常。
 
有两种可能,
1.你没有使用TIdAntiFreeze ,在Indy Misc面板
2.你添加客户机的IP在主线程中,而此时的操作造成了应用阻塞,如果是这种情况,将添加客户IP的操作放在线程中.
 
请问以下代码有什么问题?

type
ClientInfo = record
PcName:string[5];//名称
passwd:string[20];//密码
command:string[5];//指令
Ver:string[2]; //版本
Text:string; //附加信息
end;

TMyThread = class(TThread)
private
F_info:ClientInfo;
F_Athread: TIdPeerThread;
protected
procedure DoTerminate; override;
public
constructor Create(C_info:ClientInfo; const C_Athread: TIdPeerThread);
destructor Destroy; override;
procedure Execute; override;
end;

implementation

uses main;

{ TCheckThread }

constructor TMythread.Create(C_info:ClientInfo; const C_Athread: TIdPeerThread);
begin
inherited Create(False);
FreeOnTerminate := True;

F_info:=C_info;
F_Athread := C_Athread;
end;

destructor Tmythread.Destroy;
begin
inherited Destroy;
end;

procedure TMythread.DoTerminate;
begin
inherited DoTerminate;
end;

procedure TMythread.Execute;
begin
with Form1 do
begin
EnterCriticalSection(cs);
if F_info.command='ADD'then
begin
form1.listview1.items.add................
end;
LeaveCriticalSection(cs);
Terminate;
end;



//=========================

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
C_info:ClientInfo;
begin
// if (not AThread.Terminated) and (AThread.Connection.Connected=True) then
begin
AThread.Connection.ReadBuffer(C_info,SizeOf(C_info));
TMyThread.Create(C_info,AThread);
end;
end;
 
把这里

EnterCriticalSection(cs);
if F_info.command='ADD'then
begin
form1.listview1.items.add................
end;
LeaveCriticalSection(cs);

做成一个 过程,procedure 不能有参数

用 Synchronize 来调用

如:
Synchronize(UpdateCaption);



procedure MailThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;

这是多线程的问题与 idTcpServer 无关
 
涉及到主线程的调用(VCL)一定要使用Synchronize关键字
 
多人接受答案了。
 
后退
顶部