QThread阻止事件循环

时间:2013-11-07 07:46:38

标签: qt qthread

我刚刚开始使用QThreads API并面临一个奇怪的问题。

我已经使用重新实现的run()方法创建了QThread的子类 这是:

void ThreadChecker::run()
{
    emit TotalDbSize(1000);

    for (int i = 0; i < 1000; i++)
    {
        QString number;
        number.setNum(i);
        number.append("\n");
        emit SimpleMessage(number);
        //pausing is necessary, since in the real program the thread will perform quite lenghty tasks
        usleep(10000);
    }
}

以下是调用此线程的代码:

ThreadChecker thread;


connect(&thread, SIGNAL(TotalDbSize(int)), this, SLOT(SetMaximumProgress(int)));
//This slot writes the message into the QTextEdit
connect(&thread, SIGNAL(SimpleMessage(QString)), this, SLOT(ProcessSimpleMessage(QString)));

thread.start();

我打算这样做的方法是让QTextEdit每10毫秒更新一次。但相反,程序只会滞后10秒钟,然后所有信号都会立即冲出。此外,虽然程序滞后,但它的行为类似于事件循环被阻止(按钮不会[重新调整,调整大小不起作用等)

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

请尝试以下代码:

class Updater: public QObject
{
    Q_OBJECT
public slots:
    void updateLoop()
    {
        emit TotalDbSize(1000);

        for (int i = 0; i < 1000; i++)
        {
            QString number;
            number.setNum(i);
            number.append("\n");
            emit SimpleMessage(number);
            //pausing is necessary, since in the real program the thread will perform quite lenghty tasks
            usleep(10000);
        }
    }
signals:
    void TotalDbSize(...);
    void SimpleMessage(...);

};
...
QThread updaterThread;
Updater updater;
updater.moveToThread(&updaterThread);
connect(&updater, SIGNAL(TotalDbSize(int)), this, SLOT(SetMaximumProgress(int)));
//This slot writes the message into the QTextEdit
connect(&updater, SIGNAL(SimpleMessage(QString)), this, SLOT(ProcessSimpleMessage(QString)));
connect(&updaterThread, SIGNAL(started()), &updater, SLOT(updateLoop()));
updaterThread.start();
但是,我没有检查它。请注意,您应该保证updaterThreadupdater不会超出范围。

==

为什么这个问题的代码不起作用?我只能猜测:你的信号附加在QThread对象上,当你connect thread时,this和{{1}}处于同一个线程中。因此,当您发出信号时,直接连接工作并从GUI线程外部更新TextBox,这可能会导致任何结果。但请注意,我的猜测可能是错误的,并且可以使用调试器找到确切的原因。

另请阅读Threads, Events and QObjects文章。掌握如何在Qt中使用线程是一篇很棒的文章。