3

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

4

3 回答 3

4

如果您通过发出信号来执行插槽,那么这取决于您拥有的信号到插槽连接的类型。通过直接连接连接到信号的插槽将在发射器的线程中执行。通过排队连接连接的插槽将在接收者的线程中执行。请看这里:http ://doc.qt.nokia.com/4.7/threads-qobject.html

如果槽是直接执行的,使用[QThread object]->slot(),那么槽将在进行调用的线程中执行。

于 2011-02-19T09:39:19.077 回答
0

直接调用总是在调用线程的上下文中执行。

于 2011-02-19T09:36:05.753 回答
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();
}
于 2011-02-19T20:39:46.677 回答