почему qthread никогда не выходит? - PullRequest
0 голосов
/ 13 декабря 2011
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) true

f QThread (0xbfdef1e0) true

f QThread (0xbfdef1e0) true

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011
int main(int argc, char *argv[])

{

    QCoreApplication app(argc, argv);

    QThread th;

    A a;

    a.moveToThread(&th);

    th.moveToThread(&th); <------it works ,after I add this line

    th.start();

    a.f();// running in main thread

    return app.exec();

}
0 голосов
/ 13 декабря 2011

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

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

QCoreApplication::processEvents();

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

...