高佣金聘请线程杀手,帮我干净利落的杀一个THREAD(0分)

  • 主题发起人 主题发起人 唐晓锋
  • 开始时间 开始时间

唐晓锋

Unregistered / Unconfirmed
GUEST, unregistred user!
用ctThreadBlocking的时候用到以下代码:

procedure TUserThread.ClientExecute;
var
Data: ^byte;
SocketStream: TWinSocketStream;
begin
while not Terminated and ClientSocket.Connected do
try
SocketStream := TWinSocketStream.Create(ClientSocket, 1000);
GetMem(Data, 1024);
try
FillChar(Data^, 1024, 0);
if SocketStream.Read(Data^, 1024) = 0 then
begin
ClientSocket.Close;
Terminate;
end
else
begin
SocketStream.Write(Data^, strlen(PChar(Data)));
end;
finally
SocketStream.Free;
FreeMem(Data, 1024);
if not ClientSocket.Connected then
Terminate;
end;
except
ClientSocket.Close;
Terminate;
HandleException;
end;
end;

当客户断了以后,该线程还在运行,一直到等到TIMEOUT的时候才会退出
并且会出现一个RUNTIME ERROR.在线程外用TERMINATE之后,该线程还
是存在.

如何才能把这个线程KILL掉,要狠,要干净利落.

该问题的分值为0,是因为我怕到时候友是不了了之 :(

<font color>该问题的分值为300分,今晚解决500分</font>

 
好象比较困难。
 
用非阻塞方式吧。
 
用下面的方法试试,若不行,就没办法了。
TUserThread=class(TThread)
public
Data: ^byte;
SocketStream: TWinSocketStream;
procedure FreeResource;
.....
end;
在主线程中:

CloseHandle(Thread.Handle);
if Assigned(SocketStream) then Thread.SocketStream.Free;
if Data<>nil then FreeMem(Data, 1024);
....

procedure TUserThread.ClientExecute;
var
begin
while not Terminated and ClientSocket.Connected do
try
SocketStream := TWinSocketStream.Create(ClientSocket, 1000);
GetMem(Data, 1024);
try
FillChar(Data^, 1024, 0);
if SocketStream.Read(Data^, 1024) = 0 then
begin
ClientSocket.Close;
Terminate;
end
else
begin
SocketStream.Write(Data^, strlen(PChar(Data)));
end;
finally
SocketStream.Free;
SockedStream:=nil;
FreeMem(Data, 1024);
Data:=nil;
if not ClientSocket.Connected then
Terminate;
end;
except
ClientSocket.Close;
Terminate;
HandleException;
end;
end;



Thread.FreeResource;

 
不能用非阻塞方式的,因为我们的需要是通过Socket传输大量的数据,比如40Mbps,
如果用非阻塞方式,试问那个服务器的ICP/IP栈受得了(在客户端比较慢的情况下)?
 
To:Hexi

真是英雄所见略同。我正在跟晓峰商量是不是象你的方法那样做,你的帖子就上来了。
 
这样可不行噢 :)

要真正的解决才行,这可是服务端哪,万一有问题就朽大了 :(((
 
是不是出现了异常?
我想可能会出现在关闭线程的时候,因为我们手动把它给CloseHandle了,
而TThread并不知道,
如果是这样的话,你可以修改TThread做一个自己的Thread类,把FHandle给Public
掉。或添加一个方法来CloseHandle;然后让FHandle=0;这样可能好点。



 
对不起,我搞错了,应该是TServerClientThread,替换原来的TServerClientThread
 
用CloseHandle的话,好像也不能完全杀除线程啊。
我用TNMSMTP连接一台根本不存在的机器,这时就会
在NMSMTP.Connect上死等,直到TimeOut 为止。在
程序中用CloseHandle(Thread.Handle),还是无法
把它杀掉。现象:程序无法关闭,会留一个死尸在taskbar
上,然后会出一个Error:Connect 出错。
怎么解决这个问题?
 
谁给我分,我可告诉.( 不要说我贪财,我两个问题去300 分,我自己解决,
却没发收回我的分)
我在编写 THREAD 通信时也遇到此问题.
可先到 THREAD 的问题去看,再发 EMAIL 给我.
不知为何,我最近老收不到 论坛的 EMAIL
我的MAIL : GUO_LIU@HOTMAIL.COM / GUO_QPETER@263.NET


 
我给!300分!决不食言。
 
Try to add this in the loop:

if (Select(0, @FDSet, nil, nil, @TimeVal) > 0) then
// Something imcoming ?
if Socket.ReceiveBuf(FDSet, -1) = 0 then
// Oh no, it is a disconnect signal !
begin
Socket.Close;
Exit;
end;

HTH
 
这个问题我已经解决了,我在外面放一个TList管理每个线程,到时候

while FList.Count <> 0 do
begin
TUserThread(FList.Items).Terminate;
TUserThread(FList.Items).Free;
FList.Delete(i);
end;
当然,我的代码也有些改动.
谢谢大家的参与:)

下次,把分分掉
 
接受答案了.
 
TO 唐晓锋:
  能否把你的代码发给我一份,学习学习!!!
  QQ:27191895
  Email:gsw798@163.net
 
后退
顶部