子类化QThread
是在 Qt 中创建线程的错误方式。QObject
提供moveToThread
简单地允许您更改对象及其子对象的线程亲和性的功能。
更改此对象及其子对象的线程亲和性。如果对象有父对象,则不能移动它。事件处理将在 targetThread 中继续进行。
要将对象移动到主线程,请使用 QApplication::instance() 检索指向当前应用程序的指针,然后使用 QApplication::thread() 检索应用程序所在的线程。
所以你应该做的是继承QObject
而不是QThread
改变你的运行函数来将 B 对象移动到其他线程。
示例代码(未经测试)
class B : public QObject {
Q_OBJECT
public:
void run() {
}
};
class A : public QObject {
Q_OBJECT
public:
void run() {
b1Thread = new QThread;
b2Thread = new QThread;
b1.moveToThread(b1Thread);
b2.moveToThread(b2Thread);
b1.run();
b2.run();
}
protected:
B b1, b2;
private:
QThread* b1Thread, b2Thread; // Delete them in the destructor.
};
您可以在其中构造线程并将它们作为参数main.cpp
传递给类。B
请注意以下有关moveToThread
这个函数只能将一个对象从当前线程“推”到另一个线程,它不能从任意线程“拉”一个对象到当前线程。