线程退出后 connect 函数还在连接吗

s11ss 2009-10-31 03:30:55
阻塞的 connect, 连接一个不可能到达的地址,如果在主线程里面执行,会使界面长时间失去响应;

查阅网络上的资料,说是可以先设置为非阻塞的 connect, 然后如果不是连接成功(正在连接中)就使用

select 函数,通过它可以达到控制延时和不影响界面显示的目的。

觉得这样迂回不太好,就把 connect 放到线程函数里面,用WaitForSingleObject(CreateThread(...), 3000)

的方式来调用。请问 3 秒后,线程退出了(用 GetExitCodeThread 得知),那阻塞的 connect 函数真的也退出了吗?

更进一步的,线程退出后会影响到哪些方面的东西?
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
baiyu168 2009-11-01
  • 打赏
  • 举报
回复
Up
s11ss 2009-11-01
  • 打赏
  • 举报
回复
s11ss 2009-10-31
  • 打赏
  • 举报
回复
不知道 7L 的做法究竟行不行啊?

________
ps

奇怪,为什么我的 Connect_ThreadFunc() 没有加“stdcall”也可以?
s11ss 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 preserve 的回复:]
肯定停止工作的 不过强行中止不太好吧 让它超时了自己退出吧
[/Quote]
那就行了吧,强行终止应当没问题,因为没用到其它什么东西。如果等它自己超时反而会更不安全吧。

我创建线程的目的有两个:
1、connect 连接的时候不让界面失去响应
2、控制 connect 的连接时间

我的线程函数很简单:
procedure Connect_ThreadFunc();
begin
IsConnected := connect(s, name, SizeOf(name)) <> INVALID_SOCKET;
end;

通过使用 WaitForSingleObject(CreateThread(...), 3000) 来控制至多 3 秒 的连接时间,判断 WaitForSingleObject 返回值,看线程是不是 STILL_ACTIVE,如果是就 TerminateThread。然后判断 全局变量 IsConnected 是不是 True(初始置 False),即是否 connect 成功。

preserve 2009-10-31
  • 打赏
  • 举报
回复
肯定停止工作的 不过强行中止不太好吧 让它超时了自己退出吧
s11ss 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 preserve 的回复:]
如果connect函数还在阻塞 线程怎么可能退出呢
[/Quote]是的,测试有误,还没有退出;但如果使用 TerminateThread 结束了线程,是不是 connect 函数也停止工作了?
preserve 2009-10-31
  • 打赏
  • 举报
回复
如果connect函数还在阻塞 线程怎么可能退出呢
wxieyang 2009-10-31
  • 打赏
  • 举报
回复
你查查内核对象的归属问题就知道了,除了有限的几个内核对象(比如窗体)属于线程外,其他内核对象都属于进程,也就是说,那些属于进程的内核对象,不论你在什么地方窗体他,只要你不主动闭他,他就会一直保持着,不会因为创建他的线程结束了就关闭了
s11ss 2009-10-31
  • 打赏
  • 举报
回复
还有谁肯指点迷津...
s11ss 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wxieyang 的回复:]
你查查内核对象的归属问题就知道了,除了有限的几个内核对象(比如窗体)属于线程外,其他内核对象都属于进程,也就是说,那些属于进程的内核对象,不论你在什么地方窗体他,只要你不主动闭他,他就会一直保持着,不会因为创建他的线程结束了就关闭了
[/Quote]内核对象不都是属于内核的吗,怎么还有属于线程或者进程的?
connect 函数到底与内核对象有怎样的联系呢?

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧