关于线程求解,该如何解决
关于线程求解
我写了个DLL,是GPRS的通讯接口,里面有个线程,在这个线程里如果收到数据,则会创建一个数据接收的线程:
CreateThread(nil, 0, @GPRSSocketWorkThread, Pointer(recev), 0, ThreadID);
线程代码:
procedure GPRSSocketWorkThread(ns: TSocket); stdcall;
var
rtn,k: Integer;
begin
try
while true do
begin
rtn := recv(ns, recvbuf, MAX_BUF_LEN, 0);
//处理接收数据 。。。。。。。。。。
end;
except
end;
end;
现在调试中发现一个问题,如果我用CloseSocket(ns)来退出这个连接,发现程序会异常,调试结果是因为GPRSSocketWorkThread这个线程仍然在运行,请问这个线程该在什么时候来退出比较好,怎么退出?
------解决方案--------------------
你应当先结束线程,然后再CloseSocket(ns)
线程的退出不是你发个Terminate就马上结束,可能还在执行中,所以得等待线程真正结束了再释放线程用到的资源。如何等待线程结束?可以参考置顶帖,
也可以自己处理,如果线程执行时间比较固定,可以用简单方法:
Terminate;
sleep(xxx); //这个xxx的大小调整成合适大小
CloseSocket(ns);
我写了个DLL,是GPRS的通讯接口,里面有个线程,在这个线程里如果收到数据,则会创建一个数据接收的线程:
CreateThread(nil, 0, @GPRSSocketWorkThread, Pointer(recev), 0, ThreadID);
线程代码:
procedure GPRSSocketWorkThread(ns: TSocket); stdcall;
var
rtn,k: Integer;
begin
try
while true do
begin
rtn := recv(ns, recvbuf, MAX_BUF_LEN, 0);
//处理接收数据 。。。。。。。。。。
end;
except
end;
end;
现在调试中发现一个问题,如果我用CloseSocket(ns)来退出这个连接,发现程序会异常,调试结果是因为GPRSSocketWorkThread这个线程仍然在运行,请问这个线程该在什么时候来退出比较好,怎么退出?
------解决方案--------------------
你应当先结束线程,然后再CloseSocket(ns)
线程的退出不是你发个Terminate就马上结束,可能还在执行中,所以得等待线程真正结束了再释放线程用到的资源。如何等待线程结束?可以参考置顶帖,
也可以自己处理,如果线程执行时间比较固定,可以用简单方法:
Terminate;
sleep(xxx); //这个xxx的大小调整成合适大小
CloseSocket(ns);