除了钩子以外,还有没有方法取得其他线程的消息?

w_anthony 2007-08-10 04:27:28
遇到的问题是这样的,主线程执行某一函数会卡3秒左右。而我想让他在卡的这段时间内消息处理能依然如故,所以想在执行函数前开一子线程负责处理主线程的消息,执行完毕PostThreadMessage发一个WM_QUIT让子线程退出!

除了钩子以外,还有没有方法取得其他线程的消息?
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_anthony 2007-08-11
  • 打赏
  • 举报
回复
终于搞定了,只有把执行函数拆的七零八落,把创建窗口的代码扔给主线程,而子线程只负责开启摄像头的pin连接操作,就没问题了。不过互斥还是比较麻烦一点,OK了
Winner25 2007-08-11
  • 打赏
  • 举报
回复
感觉是你程序结构安排的问题,你那个3秒的任务安排一个线程,两个线程之间用消息啥的通行,不久ok了!

主线程都堵塞了,那还有消息!没有消息去取也没有用!
w_anthony 2007-08-11
  • 打赏
  • 举报
回复
到底有没有方法可以取其他线程的消息呢?

那个会卡3秒的执行函数,是用于开启摄像头的,原来执行失败,是因为该线程com没有初始化,后来我初始化了一下,单步跟踪发现它确实是执行成功了,只是捕捉的画面就是出不来。
后来才发现画面出不来是因为捕捉窗口是有子线程创建的,所以只有子线程才能处理它的消息,在该子线程里面加入消息循坏,画面总算是出来了,但是这个子线程就必须一直开在那里才行。本来是想子线程开一下马上关闭的,这样又要多管理一条线程,感觉很不好!
w_anthony 2007-08-11
  • 打赏
  • 举报
回复
To Winner25(如果我们走得太快,停一停,让灵魂跟上来)
主线程是堵了,但是窗口消息还是会被扔到消息队列里面去的,如果可以让子线程来处理主线程的窗口消息,那还是没有问题的。
把执行函数扔到子线程里面,就需要该执行函数不包含窗口创建的动作,如果子线程创建了窗口,那么这个窗口的消息就会储存在子线程的消息队列里面,这样子线程就不可以退出了,因为如果它退出的话,这个窗口的消息就没有任何线程可以响应了。
w_anthony 2007-08-10
  • 打赏
  • 举报
回复
如果让主线程负责窗口消息,可能会因为MessageBox和DoModal接手消息处理,导致开启线程的地方无法继续执行下去。

刚才试了一下,把执行函数放到线程里面,然后在结束的时候,PostThreadMessage发一个WM_QUIT给主线程,主线程原先处于GetMessage的循环,收到WM_QUIT后,会退出GetMessage循环,进入PeekMessage循环,让PeekMessage取走WM_QUIT的,结果消息确实可以继续处理了,不过那个执行函数一放到线程里面,就会执行失败,郁闷……
dyw 2007-08-10
  • 打赏
  • 举报
回复
让主线程仍负责窗口消息,创建新线程来执行长时间的任务,执行结束后通知主线程。
w_anthony 2007-08-10
  • 打赏
  • 举报
回复
如果有什么方法可以从消息队列里面取走WM_QUIT消息也可以。
w_anthony 2007-08-10
  • 打赏
  • 举报
回复
刚才试了一下,钩子也不行,郁闷。

“执行函数”开一个新的线程也是行不通的。
主线程需要执行函数的返回值,虽然主线程可以在等待函数返回值的时候用GetMessage之类的处理消息,但如果等待期间有MessageBox或者DoModal的话,就会接手原先等待的GetMessage循环,这样一来,主线程就不能在执行函数结束后继续执行下面的语句了。
alq974120alq 2007-08-10
  • 打赏
  • 举报
回复
你为什么不把“执行函数”开一个新的线程呢?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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