遇到的问题是这样的,主线程执行某一函数会卡3秒左右。而我想让他在卡的这段时间内消息处理能依然如故,所以想在执行函数前开一子线程负责处理主线程的消息,执行完毕PostThreadMessage发一个WM_QUIT让子线程退出!除了钩子以外,还有没有方法取得其他线程的消息?

解决方案 »

  1.   

    刚才试了一下,钩子也不行,郁闷。“执行函数”开一个新的线程也是行不通的。
    主线程需要执行函数的返回值,虽然主线程可以在等待函数返回值的时候用GetMessage之类的处理消息,但如果等待期间有MessageBox或者DoModal的话,就会接手原先等待的GetMessage循环,这样一来,主线程就不能在执行函数结束后继续执行下面的语句了。
      

  2.   

    如果有什么方法可以从消息队列里面取走WM_QUIT消息也可以。
      

  3.   

    如果让主线程负责窗口消息,可能会因为MessageBox和DoModal接手消息处理,导致开启线程的地方无法继续执行下去。刚才试了一下,把执行函数放到线程里面,然后在结束的时候,PostThreadMessage发一个WM_QUIT给主线程,主线程原先处于GetMessage的循环,收到WM_QUIT后,会退出GetMessage循环,进入PeekMessage循环,让PeekMessage取走WM_QUIT的,结果消息确实可以继续处理了,不过那个执行函数一放到线程里面,就会执行失败,郁闷……
      

  4.   

    到底有没有方法可以取其他线程的消息呢?那个会卡3秒的执行函数,是用于开启摄像头的,原来执行失败,是因为该线程com没有初始化,后来我初始化了一下,单步跟踪发现它确实是执行成功了,只是捕捉的画面就是出不来。
    后来才发现画面出不来是因为捕捉窗口是有子线程创建的,所以只有子线程才能处理它的消息,在该子线程里面加入消息循坏,画面总算是出来了,但是这个子线程就必须一直开在那里才行。本来是想子线程开一下马上关闭的,这样又要多管理一条线程,感觉很不好!
      

  5.   

    终于搞定了,只有把执行函数拆的七零八落,把创建窗口的代码扔给主线程,而子线程只负责开启摄像头的pin连接操作,就没问题了。不过互斥还是比较麻烦一点,OK了
      

  6.   

    To Winner25(如果我们走得太快,停一停,让灵魂跟上来) 
    主线程是堵了,但是窗口消息还是会被扔到消息队列里面去的,如果可以让子线程来处理主线程的窗口消息,那还是没有问题的。
    把执行函数扔到子线程里面,就需要该执行函数不包含窗口创建的动作,如果子线程创建了窗口,那么这个窗口的消息就会储存在子线程的消息队列里面,这样子线程就不可以退出了,因为如果它退出的话,这个窗口的消息就没有任何线程可以响应了。