MFC新手遭遇

假期用MFC做通讯程序,遇到了很多让我纠结的问题。

1.自己新建的工作线程中不能建立窗体或者对话框,这个让我抓狂了很长时间,我以为是我程序里有Bug,后来上网google了一下才明白这是一个多么基础的问题,只怪我之前没有好好学过MFC。。。

2.跨线程间传递MFC对象会有问题。由于我们是做通信程序,要用到网络传输,当时觉得既然用MFC了,那就用Csocket吧,开始用的时候觉得挺方便,和java的socket感觉差不多。但我在工作线程中想新建一个Csocket的时候就出问题了,listen后接收端的connect函数怎么都连不上,开始我有以为是程序bug,就自己设断点debug,后来上网一查,这个问题是和csocket内部实现机理有关系,整个MFC体系都是用消息映射实现的,但是接收消息靠的是窗口句柄,由于工作线程中没有窗口,所以他不能接到MFC发的消息,所以自然也就无法处理了。后来我想,UI线程中有窗口,应该可以新建cSocket吧,但是我在UI线程中新建也不好使,貌似它只接收界面点击事件的消息。后来我无奈,就在工作线程中postmessage一下,又主线程来做吧。。。通过以上两件事,我发现边用边学还是有一些问题的。。。还有就是我原来习惯遇到Bug先自己解决,不行再上网搜索,看来写MFC程序遇到问题可以先上网搜一下,看看到底是MFC的问题还是自己程序的问题。

3.我的程序要搜索整个局域网中的服务器,所以要用一个socket每个地址都连一下,如果有回应,说明它是服务器。但是这就带来一个问题,由于csocket进行连接的时候如果连接上了,那很快。那如果那个端口无连接,那么就会很慢才能连接上,这是因为系统默认的超时时间比较长,只要没超过超时时间,csocket就会持续不断地和目标端口连接,这就造成程序性能太差了,而实际上,局域网连接速度很快,10ms时间就够了,所以我用了一下设置超时的方法。用MSDN论坛上的方法就好使(网上有说它不好使的,然后自己给出一种实现方法,但是我试了,在我机子上不好使,可能和系统有关吧)。由于MSDN是用的系统的计时器,所以每次settimer,类被销毁之后必须killtimer下一个csocket才能用,否则是找不到timer的ID的(好像说的太含糊了,毕竟没代码不好说啊)。


总之,经过这一次使用MFC以后,我觉得这个东西不怎么好用,虽然说消息映射的机制挺方便,好用。但是也给程序员带来了很多限制,在编多线程程序时就会比较麻烦。看了网上的一些评论说,MFC就用来做界面吧,其他的直接用WIN API,只能黯然同意了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值