我用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.

解决方案 »

  1.   

    还没有结束是什么意思?我看你那个线程是一创建就结束了!constructor CommThread.create(TS:TTcpServer;ShowMsg:Tmemo;Port:integer);
    begin
     inherited create(false);//执行到这儿时,因为你参数是FALSE,线程立即已经执行了。。
     FTServer:=TS;
     Fport:=Port;
     FShowRec:=ShowMsg;
     FTServer.LocalPort:=inttostr(FPort);
     FreeOnTerminate:=true;
    end;
      

  2.   

    FreeOnTerminate:=true;
    表示线程执行完毕就自动结束啊 

    procedure CommThread.Execute;
    begin
      { Place thread code here }
      FTServer.OnAccept:=AcceptMsg;
      FTServer.Active:=true;
    end;
    当执行完FTServer.Active:=true;后线程也就自动结束了!
      

  3.   


    可以设置一个变量,放在 public中 如
     public
    .....
     Flag: Boolean;构造函数中将其设置为true在线程函数中:
    procedure CommThread.Execute;
    begin
      while(Flag)
    begin
      FTServer.OnAccept:=AcceptMsg;
      FTServer.Active:=true;
    end;
    end;
    基本思路是这样 你可以按照你的需求改写一下
      

  4.   

    兄弟用的是什么TCPServer控件啊?不是Indy的吧,是不是ICS的?
      

  5.   

    delphi7上安装的时候自己就带有的了,就是那个控件,不是indy,也不是ics