我用TcpServer控件写一个线程,可是我用terminate来结束它,却结束不了,
我也用了强制结束线程的api函数,还是结束不了,线程代码如下:
unit commthreadunit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets;type
CommThread = class(TThread)
private
{ Private declarations }
FPort:integer;
FTServer:TTcpServer;
FShowRec:TMemo;
procedure AcceptMsg(Sender: TObject;ClientSocket: TCustomIpClient);
procedure showinfo;
protected
procedure Execute; override;
public
RecvList:TStringList;
constructor create(TS:TTcpServer;ShowMsg:Tmemo;Port:integer);
destructor destroy;
end;implementation{ CommThread }constructor CommThread.create(TS:TTcpServer;ShowMsg:Tmemo;Port:integer);
begin
inherited create(false);
FTServer:=TS;
Fport:=Port;
FShowRec:=ShowMsg;
FTServer.LocalPort:=inttostr(FPort);
FreeOnTerminate:=true;
end;
destructor commthread.destroy;
begin
//
end;
procedure CommThread.AcceptMsg(Sender: TObject;ClientSocket: TCustomIpClient);
var
s: string;
begin
RecvList:=TStringlist.Create;
s := ClientSocket.Receiveln;
while s <> '' do
begin
RecvList.Add(s);
s := ClientSocket.Receiveln;
end;
showinfo;
Recvlist.Free;
end;
procedure commthread.showinfo;
var
i:integer;
begin
for i:=0 to recvlist.Count-1 do
begin
fshowrec.Lines.Add(recvlist.Strings[i]);
end;
end;
procedure CommThread.Execute;
begin
{ Place thread code here }
FTServer.OnAccept:=AcceptMsg;
FTServer.Active:=true;
end;end.
我也用了强制结束线程的api函数,还是结束不了,线程代码如下:
unit commthreadunit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets;type
CommThread = class(TThread)
private
{ Private declarations }
FPort:integer;
FTServer:TTcpServer;
FShowRec:TMemo;
procedure AcceptMsg(Sender: TObject;ClientSocket: TCustomIpClient);
procedure showinfo;
protected
procedure Execute; override;
public
RecvList:TStringList;
constructor create(TS:TTcpServer;ShowMsg:Tmemo;Port:integer);
destructor destroy;
end;implementation{ CommThread }constructor CommThread.create(TS:TTcpServer;ShowMsg:Tmemo;Port:integer);
begin
inherited create(false);
FTServer:=TS;
Fport:=Port;
FShowRec:=ShowMsg;
FTServer.LocalPort:=inttostr(FPort);
FreeOnTerminate:=true;
end;
destructor commthread.destroy;
begin
//
end;
procedure CommThread.AcceptMsg(Sender: TObject;ClientSocket: TCustomIpClient);
var
s: string;
begin
RecvList:=TStringlist.Create;
s := ClientSocket.Receiveln;
while s <> '' do
begin
RecvList.Add(s);
s := ClientSocket.Receiveln;
end;
showinfo;
Recvlist.Free;
end;
procedure commthread.showinfo;
var
i:integer;
begin
for i:=0 to recvlist.Count-1 do
begin
fshowrec.Lines.Add(recvlist.Strings[i]);
end;
end;
procedure CommThread.Execute;
begin
{ Place thread code here }
FTServer.OnAccept:=AcceptMsg;
FTServer.Active:=true;
end;end.
解决方案 »
- 此dll函数在vb中如何调用?
- turbo delphi 装了一下,感觉没什么特别呀??!!
- 怎么控制输入的内容
- 如何保存IMAGE上的picture,包括上面的其他的控件如label?
- 怎样知道DBGrid当前显示的记录数?不通过数据集,DBGrid本身有这个属性吗?
- 我用DBExpress中SQLStoredProc1控件动态创建参数始终出错。为什么???
- 关于索引
- 40分求delphi6的wininet.pas文件
- 一个很傻的问题:如何给分?
- 如何在Win2000中结束一个Delphi开发的多层分布式服务器端程服务,彻底清除!
- 本人快要结婚了,非常高兴,散分.....
- 【大龙驹】散点分分。。
begin
inherited create(false);//执行到这儿时,因为你参数是FALSE,线程立即已经执行了。。
FTServer:=TS;
Fport:=Port;
FShowRec:=ShowMsg;
FTServer.LocalPort:=inttostr(FPort);
FreeOnTerminate:=true;
end;
表示线程执行完毕就自动结束啊
而
procedure CommThread.Execute;
begin
{ Place thread code here }
FTServer.OnAccept:=AcceptMsg;
FTServer.Active:=true;
end;
当执行完FTServer.Active:=true;后线程也就自动结束了!
可以设置一个变量,放在 public中 如
public
.....
Flag: Boolean;构造函数中将其设置为true在线程函数中:
procedure CommThread.Execute;
begin
while(Flag)
begin
FTServer.OnAccept:=AcceptMsg;
FTServer.Active:=true;
end;
end;
基本思路是这样 你可以按照你的需求改写一下