0

我最近才开始使用 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 秒,然后所有信号立即涌现。此外,虽然程序滞后,但它的行为就像事件循环被阻止(按钮不会[按下,调整大小不起作用等)

我在这里想念什么?

4

1 回答 1

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();

不过,我没有检查它。请注意,您应该保证updaterThread并且updater不要超出范围。

======

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

另请阅读线程、事件和 QObjects文章。这是一篇了解如何在 Qt 中正确使用线程的好文章。

于 2013-11-07T08:22:43.483 回答