好久没用MFC了,请教个问题。

hnzlk 2013-07-25 11:18:20
我有一个服务端,通过客户端发送心跳包来确定是否连接,服务端用一个线程,监听,还有接收消息,用的是select模型,服务端用一个链表管理client对象。
所以在每个client中,要弄个定时器。
如果想要收到定时器消息,需要不断获取消息,那么服务端 那边收不到消息了。
所以客户端开了个线程,专门处理timer消息。
每次,有一个新的client连接过来,就建建一个client对象,开线程,启动timer,

请问, 这样的方法合理吗?有没有更好的办法?
...全文
166 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShengFei01 2013-07-25
  • 打赏
  • 举报
回复
可以用WSAAsynSelect,不需要另开线程,这有WSAAsynSelect的例子Finger: http://download.csdn.net/detail/geoff08zhang/4571358
fishion 2013-07-25
  • 打赏
  • 举报
回复
看得不是很清楚,或者只开启一个线程来进行超时没有接收的判断,在此线程中每一秒或者几秒进行链表的轮询,client可以用一个整型类型的数据关联起来进行超时的递增,同时用此数据来进行超时判断
fishion 2013-07-25
  • 打赏
  • 举报
回复
引用 11 楼 hnzlk 的回复:
[quote=引用 10 楼 fishion 的回复:] [quote=引用 9 楼 hnzlk 的回复:] [quote=引用 8 楼 fishion 的回复:] 这个循环时间我觉得可以定宽松点,用这方法估算的值本来就是不准确的,只能估算个大概值,就是不知道能不能满足你的要求了
那弄个timer应该相对准确点吧。[/quote] 那可以一个线程,多个timer就行了[/quote] 为何要多个timer?一个不行么?多个timer就不好管理了。[/quote] 我以为你是要一个client一个timer了,看需求吧
hnzlk 2013-07-25
  • 打赏
  • 举报
回复
引用 10 楼 fishion 的回复:
[quote=引用 9 楼 hnzlk 的回复:] [quote=引用 8 楼 fishion 的回复:] 这个循环时间我觉得可以定宽松点,用这方法估算的值本来就是不准确的,只能估算个大概值,就是不知道能不能满足你的要求了
那弄个timer应该相对准确点吧。[/quote] 那可以一个线程,多个timer就行了[/quote] 为何要多个timer?一个不行么?多个timer就不好管理了。
fishion 2013-07-25
  • 打赏
  • 举报
回复
引用 9 楼 hnzlk 的回复:
[quote=引用 8 楼 fishion 的回复:] 这个循环时间我觉得可以定宽松点,用这方法估算的值本来就是不准确的,只能估算个大概值,就是不知道能不能满足你的要求了
那弄个timer应该相对准确点吧。[/quote] 那可以一个线程,多个timer就行了
hnzlk 2013-07-25
  • 打赏
  • 举报
回复
引用 8 楼 fishion 的回复:
这个循环时间我觉得可以定宽松点,用这方法估算的值本来就是不准确的,只能估算个大概值,就是不知道能不能满足你的要求了
那弄个timer应该相对准确点吧。
fishion 2013-07-25
  • 打赏
  • 举报
回复
这个循环时间我觉得可以定宽松点,用这方法估算的值本来就是不准确的,只能估算个大概值,就是不知道能不能满足你的要求了
hnzlk 2013-07-25
  • 打赏
  • 举报
回复
引用 6 楼 fishion 的回复:
[quote=引用 5 楼 hnzlk 的回复:] [quote=引用 1 楼 fishion 的回复:] 看得不是很清楚,或者只开启一个线程来进行超时没有接收的判断,在此线程中每一秒或者几秒进行链表的轮询,client可以用一个整型类型的数据关联起来进行超时的递增,同时用此数据来进行超时判断
你的意思是单独开一个线程?弄个timer,每次轮循判断是否超时?如果这样,该如何传参到这个timer消息中去?[/quote] 不用timer了,就是轮询链表,时间标记加1,如果接收端接收到消息的,时间标记置0[/quote] 明白了,不用传参,直接加就行了。但是不用timer的话,那不是循环很快的?这个时间不好控制吧。
fishion 2013-07-25
  • 打赏
  • 举报
回复
引用 5 楼 hnzlk 的回复:
[quote=引用 1 楼 fishion 的回复:] 看得不是很清楚,或者只开启一个线程来进行超时没有接收的判断,在此线程中每一秒或者几秒进行链表的轮询,client可以用一个整型类型的数据关联起来进行超时的递增,同时用此数据来进行超时判断
你的意思是单独开一个线程?弄个timer,每次轮循判断是否超时?如果这样,该如何传参到这个timer消息中去?[/quote] 不用timer了,就是轮询链表,时间标记加1,如果接收端接收到消息的,时间标记置0
hnzlk 2013-07-25
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
看得不是很清楚,或者只开启一个线程来进行超时没有接收的判断,在此线程中每一秒或者几秒进行链表的轮询,client可以用一个整型类型的数据关联起来进行超时的递增,同时用此数据来进行超时判断
你的意思是单独开一个线程?弄个timer,每次轮循判断是否超时?如果这样,该如何传参到这个timer消息中去?
hnzlk 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 happyparrot 的回复:
如果想要收到定时器消息,需要不断获取消息,那么服务端 那边收不到消息了。 ==这句很含糊。定时器不是消息啊
假如在一个线程中的话, 比如我收到一个连接请求后,我会new一个client对象,还需要启动一个timer,那收到timer消息,必须下面这样,如果这样,那么我就收不到客户端发过来的请求和消息了。 while (1) { GetMessage(&msg, NULL, 0, 0); DispatchMessage(&msg); }
快乐鹦鹉 2013-07-25
  • 打赏
  • 举报
回复
如果想要收到定时器消息,需要不断获取消息,那么服务端 那边收不到消息了。 ==这句很含糊。定时器不是消息啊

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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