QThread没有开始

时间:2015-03-24 16:04:33

标签: qt qthread

我遵循了link about QThread

虽然我做了所有相同的事情(除了未注释的错误处理),但未调用Worker::process。 我不知道我做错了什么。我认为,存在非常根本的问题。

代码:

class Worker : public QObject {
    Q_OBJECT

public:
    Worker(){};
    ~Worker(){};

    public slots:
        void process();

    signals:
        void finished();
        void error(QString err);

private:
    // add your variables here
};

void Worker::process()
{
    while(1)
    {
        printf("\nHallo !");
    }
    emit finished();
}

int test_thread()
{
    QThread* thread = new QThread;

    Worker* worker = new Worker();
    worker->moveToThread(thread);


   //QObject::connect(worker, SIGNAL(error(QString)), this,       SLOT(errorString(QString)));
    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();

    return 0;
}

1 个答案:

答案 0 :(得分:2)

你已经关闭了,但是你错过了一些关键概念。

想想代码

while(1)
{
    printf("\nHallo !");
}
emit finished();

正在做。由于你的无限循环,永远不会发出finished信号。尝试这样的事情:

int counter = 0;
const unsigned int max = 10;
while (++counter < max) {
    print("\nHallo, iteration %d", counter);
}

emit finished();

您可以看到有用的工作正在完成,但随后会发出信号finished

QCoreApplication是整个应用程序的信号代理。在没有启动的情况下,应用程序不会解释任何信号/槽,除非线程包含它自己的信号和槽定义。 注意:直接连接不需要事件循环。

要解决此问题,请在主要内容的这两行之间插入QCoreApplication::exec()

thread->start();
// put right here
return 0;

此外,您可能还想在线程返回时停止exec(),但我会将此作为练习留给读者。