在文档中它说:
在多线程应用程序中,您可以使用QTimer
在任何线程中
有一个事件循环。要从非 GUI 线程启动事件循环,请使用QThread::exec()
。 Qt 使用定时器的线程亲和性来确定
哪个线程将发出timeout()
信号。正因为如此,你
必须在其线程中启动和停止计时器;这是不可能的
从另一个线程启动计时器。
所以当我有一个QTimer
对象,Qt 使用该对象(或其父对象)的线程关联性来确定哪个线程将发出timeout()
signal.
但是当我使用静态成员函数时会发生什么singleShot(..)
这不需要一个QTimer
例如,哪个线程会发出超时信号?
Qt 是开源的,所以最好的方法是检查源代码 https://qt.gitorious.org/qt/qt/source/57756e72adf2081137b97f0e689dd16c770d10b1%3asrc/corelib/kernel/qtimer.cpp#L340-356。
所以对象内部类QSingleShotTimer https://qt.gitorious.org/qt/qt/source/57756e72adf2081137b97f0e689dd16c770d10b1%3asrc/corelib/kernel/qtimer.cpp#L275被创建(它是QObject
但不是QTimer
).
回答你问题的最重要的一句话是here https://qt.gitorious.org/qt/qt/source/57756e72adf2081137b97f0e689dd16c770d10b1%3asrc/corelib/kernel/qtimer.cpp#L291:
connect(this, SIGNAL(timeout()), receiver, member);
没有moveToThread
所以它的工作原理是这样的:
- 为当前线程创建临时对象
- 信号是从该线程发出的
- 如果目标对象被分配给同一个线程,则立即调用槽
- 否则,槽调用将在目标所属线程的事件循环中排队。
请参阅文档connect http://qt-project.org/doc/qt-4.8/qobject.html#connect及其价值观第 5 个参数(连接类型) http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum.
请注意,如果msec
值为零,则槽的调用将在接收者所属线程的偶循环中排队(不创建临时对象)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)