关于QThread的问题

时间:2011-02-19 09:03:03

标签: multithreading qt qthread

如果我创建一个QThread并从另一个线程调用其中一个插槽,它是在QThread对象的线程的上下文中调用,还是从调用该调用的线程的上下文调用?

3 个答案:

答案 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();
}