Tôi đang cố gắng tìm hiểu rõ hơn về tín hiệu và khe Qt cùng với chuỗi. Vì vậy, tôi đã cố gắng ứng dụng tối thiểu này:Chuỗi Qt không dừng lại sau khi gọi thoát/thoát
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;
}
Mọi thứ đều tốt đẹp, chỉ có t.wait() ở cuối không bao giờ trở lại. Sự hiểu biết của tôi là gọi quit() nên dừng vòng lặp sự kiện, có nghĩa là exec() sẽ trở lại và do đó nên chạy() và thực hiện luồng nên dừng lại. Tui bỏ lỡ điều gì vậy?
tên của các phương pháp của bạn nên làm rõ mục đích của chúng. – UmNyobe
Đừng lo, đây không phải là mã sản xuất! Tôi thấy tên giả mạo hoạt động tốt hơn nhiều trong mã mẫu/thử nghiệm ngắn, hơn là tên mô tả giả tạo. – Elektito
Tôi đồng ý với UmNyobe. Sẽ dễ dàng hơn khi đọc và hiểu mã mẫu nếu bạn sử dụng nhiều tên thông tin hơn. Ví dụ. A :: doit() -> A :: emitThreadStart(), void x() -> startThread(), void h() -> void quitApplication() ... etc – Dmitriy