谈谈PostThreadMessage使用

来源:互联网 发布:codevs java 编辑:程序博客网 时间:2024/05/16 08:18

   今天不CSDN是怎么了,又访问不了了。

   第一年学习MFC,使用多线程还算娴熟。但一直却不知道消息队列是基于线程的,可谓悲剧,说着都脸红。今天有这么一个需求,多个工作线程在完成时需要写日志,该功能非必要功能,由于写的量还是比较大,而且多个线程同时写一个文件我也不知道会不会出问题,虽然现在我开20个线程的时候没有发现文件被写乱的情况,但是还是有点担心的。决定使用另一个线程来完成写日志的功能。我在想,使用事件等待如何,如果同时有两个线程使得事件有信号,是不是其中一个会丢失;说到这,忽然想到我使用的消息机制,消息会不会被合并呢,想WM_PAINT一样,应该不会,好像WM_PAINT是一个特殊消息吧。这个需要下去验证一下,反正我的程序跑起来现在没发现问题。

在写日志线程中使用PeekMessage或使用GetMessage建立消息循环,我在项目中使用的时候PeekMessage使用PM_REMOVE居然也没有移除消息,导致一直循环不停,改用GetMessage问题解决,还没找到原因,太忙了。问题是:PosThreadMessage是阻塞的吗,根据我答应的日志,该函数不是阻塞的,不会导致工作现场阻塞。有的地方说使用GetMessage会导致消息发送方阻塞,可能说的是SendMessage吧,但用SendMessage难道消息循环用PeekMessage就不阻塞了吗?奇怪。

代码后面在提上了


今天发贴,主要是提醒一下自己,不熟悉的东西在项目中使用会带来未知因素:

优先队列,一个我认为会按我想法工作的队列,最后让我悲催了。项目需求是优先级不同的,小的优先,优先级相同的,先进队列的优先出队。多么简单的一个想法,最后在STL的priority_quene面前,我 倒下了,一直以为这很简单,重载比较操作符不就搞定了吗?测试的时候也不仔细,对优先级相同的没怎么测,忽然在要完结准备提测的时候,发现问题,优先级相同的出队顺序并不是按入队顺序进行的。原因???原因就是:priority_quene底层是用堆排序实现的。第一反应,那这个真要重写一个优先队列了。当然最后还是使用priority_quene,但我不得不在入队优先级上做文章,把原先规定的优先级进行调整,把入队序号作为优先级的一部分加入,最后也导致我改了几个优先级操作的地方,虽然比起重写少花点时间,但代码变得奇怪了,为什么这样加一个数上去,而且幸亏我这个项目这样可以解决,如果这样不行呢,不是浪费太多了。

总结就是:引入项目中的东西,自己要非常熟悉其特性的,如果不熟悉最好不要盲目引入项目,可以先调研好特性是否完全满足要求才加入,否则会导致浪费人力物力不讨好。

  这几天在看鬼谷子的《本经阴符七术》很有意思。发现自己要学习的其实很多,对自己的认识还不够。不清楚自己到底想要什么,又如何能够静下心来呢?鬼谷子,乃一神人也。

原创粉丝点击