不同的Qt 方法调用和信号槽连接类型有以下选择:
- 直接连接:在当前线程中调用方法,明显阻塞。
- 排队连接:从接收者的事件循环调用方法,从不阻塞。
- 自动连接:在目标对象的线程中调用方法,如果当前则阻塞,否则排队而不阻塞。
- 阻塞队列连接:在目标对象的线程中调用方法,如果不是当前线程则阻塞,否则死锁。
但是,我需要像 "Blocking Auto Connection" 这样的东西,如果目标对象位于同一个线程中,它将充当直接连接,否则会阻塞队列连接。
如何?
作为参考,当前的解决方案似乎可以归结为......这显然不是一个好方法。幸运的是,它位于一个无关紧要的位置,但仍然......无论如何,无需对此发表评论,这不是代码审查问题:-)
QMetaObject::invokeMethod(target, "method", Qt::AutoConnection, ...);
// If same thread, method call is already done here and sleep is skipped
while(!target->isDone()) sleep(1);