【发布时间】:2012-02-20 08:26:02
【问题描述】:
我试图更好地理解 Qt 信号和插槽与线程的结合。所以我尝试了这个最小的应用程序:
foo.h:
#include <QObject>
class A : public QObject {
Q_OBJECT
public:
void doit();
signals:
void x();
};
class B : public QObject {
Q_OBJECT
public slots:
void h();
};
foo.cpp:
#include "foo.h"
#include <QThread>
#include <QCoreApplication>
void B::h() {
qDebug("[%d] B::h() here!", (int) QThread::currentThreadId());
QCoreApplication::instance()->quit();
}
void A::doit() {
qDebug("[%d] emitting...", (int) QThread::currentThreadId());
emit x();
}
int main(int argc, char* argv[]) {
QCoreApplication app(argc, argv);
A a;
B b;
QObject::connect(&a, SIGNAL(x()), &b, SLOT(h()));
QThread t;
t.start();
b.moveToThread(&t);
a.doit();
t.wait();
return 0;
}
一切都很好,只有最后的 t.wait() 永远不会返回。我的理解是调用 quit() 应该停止事件循环,这意味着 exec() 应该返回,run() 应该返回并且线程执行应该停止。我错过了什么吗?
【问题讨论】:
-
你的方法的名字应该明确他们的目的。
-
别担心,这不是生产代码!我发现假名在简短的示例/测试代码中比人为的描述性名称更有效。
-
我同意 UmNyobe。如果您使用更多信息的名称,将更容易阅读和理解示例代码。例如。 A::doit() -> A::emitThreadStart(), void x() -> startThread(), void h() -> void quitApplication() ...等
-
也许你是对的,因为这最终发布在公共论坛上。我喜欢在自己的测试中使用短名称,但这可能不适合它。
标签: multithreading qt signals-slots