почему qthread никогда не выходит?

class A:public QObject
{

    Q_OBJECT

    public slots:

    void f() {
        while(1) {
            qDebug()<<"f"<<thread()<<thread()->isRunning();
            sleep(1);
            **QMetaObject::invokeMethod(thread(), "quit", Qt::QueuedConnection);**
        }
    }

    public slots:

    void g() { qDebug() << "g"; }
};


int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QThread th;
    A a;
    a.moveToThread(&th);
    th.start();
    a.f();// running in main thread
    return app.exec();
}

вывод всегда такой:

f QThread(0xbfdef1e0) истина

f QThread(0xbfdef1e0) истина

f QThread(0xbfdef1e0) истина

Мне было интересно, почему qthread никогда не завершается, потому что я вызываю quit внутри цикла, используя "QMetaObject::invokeMethod(thread(), "quit", Qt::QueuedConnection);"

Спасибо


person camino    schedule 13.12.2011    source источник


Ответы (1)


Ваш поток никогда не завершается, потому что он находится в жестком бесконечном цикле. Если вы никогда не поддадитесь четному циклу Qt, он не сможет выполнять никакие действия в очереди. Qt не может волшебным образом остановить выполнение вашего кода, чтобы запустить цикл обработки событий.

Если вы добавите в свой цикл следующую строку, вы увидите, что поток останавливается:

QCoreApplication::processEvents();

потому что вам все еще нужно уступить циклу событий Qt, чтобы он мог передать ваш сигнал другому потоку.

person Chris    schedule 13.12.2011
comment
a.f() работает в основном потоке, а не в подпотоке, подпоток может обрабатывать очередь событий. - person camino; 13.12.2011