我刚刚开始使用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秒钟,然后所有信号都会立即冲出。此外,虽然程序滞后,但它的行为类似于事件循环被阻止(按钮不会[重新调整,调整大小不起作用等)
我在这里缺少什么?
答案 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();
但是,我没有检查它。请注意,您应该保证updaterThread
和updater
不会超出范围。
==
为什么这个问题的代码不起作用?我只能猜测:你的信号附加在QThread对象上,当你connect
thread
时,this
和{{1}}处于同一个线程中。因此,当您发出信号时,直接连接工作并从GUI线程外部更新TextBox,这可能会导致任何结果。但请注意,我的猜测可能是错误的,并且可以使用调试器找到确切的原因。
另请阅读Threads, Events and QObjects文章。掌握如何在Qt中使用线程是一篇很棒的文章。