3

QThread を作成し、そのスロットの 1 つを別のスレッドから呼び出した場合、それは 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 に答える