我给线程的OnTerminate指定了事件,可是线程结束的时候却没有调用我指定的事件;
而且我做了~THREAD的事件,也没有被调用;我的线程设定了FreeOnTerminate := ture属性的;
我是调用Terminate正常的让线程退出循环的;请高手赐教怎么能让线程结束的时候做一见指定的事情;
而且我做了~THREAD的事件,也没有被调用;我的线程设定了FreeOnTerminate := ture属性的;
我是调用Terminate正常的让线程退出循环的;请高手赐教怎么能让线程结束的时候做一见指定的事情;
我demo目录中看到例程中有一句: OnTerminate := ThreadDone;
请问 其中 ThreadDone 是什么意思,我怎么也找不着它呢?
{}而且以下的代码也不能执行到
我是用这样的代码结束线程的; myDnsSniffer->Suspend() ;
myDnsSniffer->Terminate();
myDnsSniffer = NULL;可是都不能搞定调用“ 析构函数 ” 和“OnTerminate”事件线程好象不能用DELETE myDnsSniffer 的方法释放,用了就停止响音
begin
ShowMessage('EndThread') ;
end ;var
t : TThTest ; t := TThTest.Create(False) ;
if t.Suspended then t.Resume;
t.OnTerminate := AfterExecute ;
if Assigned(RecvDataThread) then
begin
RecvDataThread.Terminate;
RecvDataThread.Destroy;
RecvInfo.Free;
end;
{
int ssock;
RecvBuf[0] = '\0'; // msgbuf[513] int cli_len;
cli_len = sizeof(addr_in);
memset((char *)&cli, '\0', sizeof(cli));
int nt; int namelen = sizeof(cli);
ssock = accept(sock, (struct sockaddr *)&cli,&namelen);
nt = recvfrom(ssock,RecvBuf, 512,0,(struct sockaddr *)&cli, &cli_len);
if ( nt > 0)
{
memset(&ReplyBuf,'\0',1024);
BuildBuf(ReplyBuf);
RespondHttp(ssock,cli,sizeof(cli),ReplyBuf,sizeof(ReplyBuf));
}
shutdown(ssock, SD_BOTH);
close(ssock);
}
我的线程执行代码里是一个阻塞的SOCKET,不知道是不是会影响线程结束;
我也早就指定了OnTerminate 函数也在线程内做了 析构函数,可是就是没有被调用;
我在上面就说了,我不能用析构函数,一用就会停止响应;我是希望线程结束的时候自动调用;
更改FreeOnTerminate属性我也用了,没有效果;
我的资源依然没有释放;
难道要调用API去杀死一个线程?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ;type
TForm1 = class(TForm)
Button1: TButton; //创建并启动线程实例
Button2: TButton; //结束线程(TerminateThread())
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure AfterExecute(Sender : TObject) ;
end; TThTest = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Show ;
end;var
Form1: TForm1;
b : Boolean = True ;
t : TThTest ;implementation{$R *.dfm}{TThTest}procedure TThTest.Execute;
begin
Synchronize(Show)
end;procedure TThTest.Show ;
var
i : Integer ;
s : String ;
begin
for i := 0 to 100 do
begin
if b then
begin
Sleep(100) ;
Form1.Caption := IntToStr(i) ;
Application.ProcessMessages ;
end
Else
Exit ;
end ;
end ;{TForm1}procedure TForm1.AfterExecute(Sender : TObject) ;
begin
ShowMessage('1234') ;
end ;procedure TForm1.Button1Click(Sender: TObject);
begin
b := True ;
t := TThTest.Create(False) ;
with t do
if Suspended then Resume;
t.OnTerminate := AfterExecute ;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
b := False ;
TerminateThread(t.Handle,0);
t.Free ;
Caption := 'end ' ;
end;end.