原因
我设计如下:
问题在子子线程发送给子线程信号时,子线程槽函数没有接受到。再看了一些博客,突然有一些谈到如果事件如果没有归还到槽函数所在的线程,或者线程消息循环一直忙处于阻塞状态的话,那它是接收不到外界的信息。然后我把子线程消息循环屏蔽掉,发现子线程槽函数是能接收到信号的。基于设计发现子线程消息循环是不能 取消的,就修改了连接方式结果发现是可行的。
写这篇博客原因呢,是因为我在程序中遇到过这个问题,参考了多篇博客,个人总结如下几点,并引用如下两篇
博客
博客
总结如下几点:
- Qt 信号槽连接可能参数不对应,或者参数是自定义的没注册导致不能识别。
- Qt槽连接方式导致引起,主要是直接连接与队列连接区别(参数是否需要将信号的参数塞到信号队列里)。
- 对应的槽所在的线程一直处于繁忙中(忙于自己的消息事件队列,无法接收到外部事件,信号槽等)。
扩展
琢磨Qt线程如何触发finished信号,Qt文档如下说明:
This signal is emitted from the associated thread right before it finishes executing.
如何才知道线程结束执行呢?
- 对于继承自QThread子类说,如果不默认写虚函数run,调用quit,是能退出事件循环,触发finished信号的。如果有自己的实现run函数,如果有exc() 消息循环,quit可以退出消息循环,否你调用quit是没啥作用的,除非使用return退出函数才能触发finished()
- 对于使用movetoThread(),使用所关联的线程.quit(),是能很好的退出并触发finished信号的。