如果我创建一个QThread并从另一个线程调用其中一个插槽,它是在QThread对象的线程的上下文中调用,还是从调用该调用的线程的上下文调用?
答案 0 :(得分:4)
如果通过发出信号执行插槽,则取决于您具有的信号到插槽连接的类型。通过直接连接连接到信号的插槽将在发射器的线程中执行。通过排队连接连接的插槽将在接收器的线程中执行。请看这里:http://doc.qt.nokia.com/4.7/threads-qobject.html
如果使用[QThread对象] - > slot()直接执行插槽,则插槽将在进行调用的线程中执行。
答案 1 :(得分:0)
直接调用总是在调用线程的上下文中执行。
答案 2 :(得分:0)
信号调用的插槽将在与QObject
关联的线程中运行。直接调用的插槽将在当前线程中运行。这是一个演示的测试程序。
输出:
main() thread: QThread(0x804d470)
run() thread: Thread(0xbff7ed94)
onRunning() direct call; thread: Thread(0xbff7ed94)
onRunning() signaled; thread: QThread(0x804d470)
测试程序:
#include <QtCore>
class Thread : public QThread
{
Q_OBJECT
public:
void run()
{
qDebug() << "run() thread:" << QThread::currentThread();
emit running();
}
public slots:
void onRunning()
{
qDebug() << "onRunning() thread:" << QThread::currentThread();
}
signals:
void running();
};
#include "threadTest.moc"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug() << "main() thread:" << QThread::currentThread();
Thread t;
QObject::connect(&t, SIGNAL(running()), &t, SLOT(onRunning()));
t.start();
QTimer::singleShot(100, &app, SLOT(quit()));
return app.exec();
}