我写了个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这个线程仍然在运行,请问这个线程该在什么时候来退出比较好,怎么退出?
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这个线程仍然在运行,请问这个线程该在什么时候来退出比较好,怎么退出?
解决方案 »
- 关于在SQL里查询中文数据的问题
- 招聘Delphi程序员,熟悉fastreport,Ehlib,基本SQL语言
- 数据集字段列表
- 有哪位大哥知道如何在滚动时让Excel标题栏不动!在Excel里是怎么设置的?
- 一个日期类型的问题,请高手们帮帮忙,小弟在线等待!!!!
- 自动拨号的问题?
- 请问怎么编写象oicq 浏览器的程序啊?
- 控件浏览出来的页面跟原来的就错位了,整个页面偏右下角下移!请问这个问题怎么解决呀????
- F1book的问题!
- 为什么我打开.DBF表,里边中文都显示成#号?
- 用delphi编写一个控制鼠标点击功能的小程序
- 问:创建一个类,procedure Execute;override;是自动执行的吗?
线程的退出不是你发个Terminate就马上结束,可能还在执行中,所以得等待线程真正结束了再释放线程用到的资源。如何等待线程结束?可以参考置顶帖,也可以自己处理,如果线程执行时间比较固定,可以用简单方法:Terminate;
sleep(xxx); //这个xxx的大小调整成合适大小
CloseSocket(ns);