首页| 论坛| 消息

回复: Qt的多线程是不是不能使用QTimer
#26 回 angelus 的帖子 [圣域天子 11-15 17:10]
angelus:主线程内直接走的是回调函数类型,异步信号走的都是事件队列,保持默认应该是最好的选择,让Qt根据实际环境去设置方式
 (2019-11-15 14:11) 
这也是为什么Qt的类默认无法跨线程。
我大多要求能跨线程使用,所以一般不用默认的调用方式
#27 回 圣域天子 的帖子 [angelus 11-15 17:17]
圣域天子:这也是为什么Qt的类默认无法跨线程。
我大多要求能跨线程使用,所以一般不用默认的调用方式 (2019-11-15 17:10)
我有点糊涂,你要求跨线程,不是应该用 Qt::QueuedConnection 吗?
Qt::DirectConnection只能在当前线程中执行。
Qt: AutoConnection
如果接收方位于发出信号的线程中,则使用Qt::DirectConnection。否则,使用Qt::QueuedConnection。
用默认的不更好吗?自动判断接收方是否跨线程
#28 回 angelus 的帖子 [圣域天子 11-15 18:00]
angelus:我有点糊涂,你要求跨线程,不是应该用 Qt::QueuedConnection 吗?
Qt::DirectConnection只能在当前线程中执行。
Qt: AutoConnection
....... (2019-11-15 17:17) 
是的,但 Qt::DirectConnection 相当于与线程无关。可以在当线程程中调用其它方法。这是亲测出来的。
但 Qt::QueuedConnection 还是线程相关的。跨线程时会出问题。
#29 [dbzhang800 11-16 22:08]
看Qt手册的话,很少有函数标称是 threadsafe 的,但 postEvent() 是线程安全的:
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
....
Note: This function is thread-safe
这一函数,方便了我们在多线程之间传递数据(通过事件队列),而不需要手动加锁。
QueuedConnection信号槽 其实也是通过这一个函数的将 信号封装成一个对象,进而传递到目标线程的事件队列的。目标线程的事件循环发现收到对象后,将其作为函数和函数参数进行调用。
不用这一机制,也没什么错,无非Qt不保证线程安全,和常规多线程一样,自己手动加锁就好了。
#30 回 yanwuyue 的帖子 [wcrqpdb 11-18 10:07]
yanwuyue:继承的不要带this,直接qtimer(),并且实例化的k也只能在run里面使用或者信号控制 (2019-11-11 09:42) 
你可以试一下,没有this也一样不行

<< 4 5 6 7 >> (6/7)

回复 发表
主题 版块