为什么一旦调用 Button2Click(即IDTcpServer.Threads.LockList.Count)后,在ISTCPSERVER中的线程就无法继续工作?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent,
IdTCPServer, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
List: TListView;
List2: TListView;
Button1: TButton;
IDTCPServer: TIdTCPServer;
IdTCPClient1: TIdTCPClient;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IDTCPServerConnect(AThread: TIdPeerThread);
procedure IDTCPServerExecute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
IdTCPClient: TIdTCPClient;
begin
try
IdTCPClient:=TIdTCPClient.Create(self);
IdTCPClient.Port:=2222;
IdTCPClient.Host:='127.0.0.1';
IdTCPClient.Connect(5000);
except
IdTCPClient.Disconnect;
IdTCPClient.Free;
end;end;procedure TForm1.Button2Click(Sender: TObject);
var
Item:TListItem;
I:integer;
begin
try
List2.Clear;
for i:=0 to IDTcpServer.Threads.LockList.Count-1 do
begin
item:=List2.Items.Add;
item.Caption:=TIdPeerThread(IDTcpServer.Threads.LockList.Items[i]).Connection.Socket.Binding.PeerIP;
end;
finally
IDTCPServer.Threads.UnlockList;//已经解锁了啊.
end;
end;procedure TForm1.IDTCPServerConnect(AThread: TIdPeerThread);
var
Item:TListItem;
begin item:=List.Items.Add;
item.Caption:=athread.Connection.Socket.Binding.PeerIP;
Athread.Suspend;//一旦调用IDTcpServer.Threads.LockList.Count后,LIST中就不会显示ATHREAD的信息?
end;
procedure TForm1.IDTCPServerExecute(AThread: TIdPeerThread);
begin
//dd
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent,
IdTCPServer, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
List: TListView;
List2: TListView;
Button1: TButton;
IDTCPServer: TIdTCPServer;
IdTCPClient1: TIdTCPClient;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IDTCPServerConnect(AThread: TIdPeerThread);
procedure IDTCPServerExecute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
IdTCPClient: TIdTCPClient;
begin
try
IdTCPClient:=TIdTCPClient.Create(self);
IdTCPClient.Port:=2222;
IdTCPClient.Host:='127.0.0.1';
IdTCPClient.Connect(5000);
except
IdTCPClient.Disconnect;
IdTCPClient.Free;
end;end;procedure TForm1.Button2Click(Sender: TObject);
var
Item:TListItem;
I:integer;
begin
try
List2.Clear;
for i:=0 to IDTcpServer.Threads.LockList.Count-1 do
begin
item:=List2.Items.Add;
item.Caption:=TIdPeerThread(IDTcpServer.Threads.LockList.Items[i]).Connection.Socket.Binding.PeerIP;
end;
finally
IDTCPServer.Threads.UnlockList;//已经解锁了啊.
end;
end;procedure TForm1.IDTCPServerConnect(AThread: TIdPeerThread);
var
Item:TListItem;
begin item:=List.Items.Add;
item.Caption:=athread.Connection.Socket.Binding.PeerIP;
Athread.Suspend;//一旦调用IDTcpServer.Threads.LockList.Count后,LIST中就不会显示ATHREAD的信息?
end;
procedure TForm1.IDTCPServerExecute(AThread: TIdPeerThread);
begin
//dd
end;end.
解决方案 »
- listview 删除一行中重复列值的行
- list index out of bound 的问题,请各位看看错在哪
- odac连接oracle,用smartquery执行insert时提示"...read-only dataset..."
- 向你们请教
- ServerSocket的连接过了几个钟就不行了,要重启动软件才行,到底怎么会事???
- delphi8编译Vcl Form application出错?
- 为什么showmodal总是有问题???
- 应聘工作交作品,交什么作品比较好呢
- 'Trying to modify read-only field'是什么错误?
- 有没有关于dilphi好的书请介绍几本了。
- 标题栏上的icon图标
- 各位大虾都过来看看呢
还有建议用一个局部 TList 变量存放 IDTcpServer.Threads.LockList,这样可以避免对 IDTcpServer.Threads 进行多次 Lock 操作(会出现什么问题还没有找到参考,但是不建议这么做)。
希望有所帮助。
我按您说的修改了代码还是不行:procedure TForm1.Button1Click(Sender: TObject);
var
IdTCPClient: TIdTCPClient;
begin
try
IdTCPClient:=TIdTCPClient.Create(self);
IdTCPClient.Port:=2222;
IdTCPClient.Host:='127.0.0.1';
IdTCPClient.Connect(5000);
except
IdTCPClient.Disconnect;
IdTCPClient.Free;
end;end;procedure TForm1.Button2Click(Sender: TObject);
var
Item:TListItem;
I:integer;
Ls:TList;
begin
try
List2.Clear;
ls:=Tlist.Create;
ls:= IdThreadMgrDefault1.ActiveThreads.LockList;
for i:=0 to ls.Count-1 do
begin
item:=List2.Items.Add;
item.Caption:=TIdPeerThread(ls.Items[i]).Connection.Socket.Binding.PeerIP;
end;
finally
IdThreadMgrDefault1.ActiveThreads.UnlockList;
Ls.Free;
end;
end;procedure TForm1.IDTCPServerExecute(AThread: TIdPeerThread);
var
Item:TListItem;
begin item:=List.Items.Add;
item.Caption:=athread.Connection.Socket.Binding.PeerIP;
Athread.Suspend;
end;end.
你上例有问题,不必用 ls:=Tlist.Create; 这句,因为 IdThreadMgrDefault1.ActiveThreads.LockList 本身就返回了一个 TList 对象的参考(指针),所以也就不能进行 Ls.Free;。
TIdThreadMgrDefault 没有用过,不知在这里例子中有没有影响。
源程序是这样的,不过Athread.Suspend应该没有影响吧.
//////////////////////////////////////////////////
item:=List.Items.Add;
item.Caption:=athread.Connection.Socket.Binding.PeerIP;
if Stringlist.count<1 then
Athread.Suspend
else
DO SOMETING
////////////////////////////////////////////////////