Вопросы о QThread - PullRequest
       6

Вопросы о QThread

3 голосов
/ 19 февраля 2011

Если я сделаю QThread и вызову один из его слотов из другого потока, будет ли он вызываться в контексте потока объекта QThread или из контекста потока, который сделал вызов?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2011

Если вы выполняете слот, испуская сигнал, то это зависит от типа вашего соединения «сигнал-слот».Слот, подключенный к сигналу через прямое соединение, будет выполняться в потоке эмитента.Слот, подключенный через соединение с очередями, будет выполняться в потоке получателя.Смотрите здесь: http://doc.qt.nokia.com/4.7/threads-qobject.html

Если слот выполняется напрямую, с помощью [QThread object] -> slot (), то слот будет выполняться в потоке, который выполняет вызов.

0 голосов
/ 19 февраля 2011

Слот, вызываемый сигналом, будет запущен в потоке, для которого связан 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();
}
0 голосов
/ 19 февраля 2011

Прямые вызовы всегда выполняются в контексте вызывающего потока.

...