让我举个例子。
class B : public QThread {
public:
void run() {
}
};
class A : public QThread {
public:
void run() {
b1.start(); b2.start();
}
protected:
B b1, b2;
};
我希望A :: b1和A :: b2作为完全独立的线程运行,而不是共享父线程(A)的资源。有没有办法将主线程指定为b1和b2的父线程?
我也看过QThreadPool和QRunnable,我不明白,如何管理线程池中的所有runnable(例如,停止其中一个,然后再次运行)。
答案 0 :(得分:5)
子类化QThread
是在Qt中创建线程的wrong way。 QObject
提供函数moveToThread
,它只允许您更改对象及其子对象的线程关联。
更改此对象及其子对象的线程关联。该 如果对象具有父对象,则无法移动该对象。事件处理将 继续在targetThread。
要将对象移动到主线程,请使用QApplication :: instance() 检索指向当前应用程序的指针,然后使用 QApplication :: thread()检索应用程序所在的线程 住。
所以你应该做的是继承QObject
而不是QThread
并更改你的run函数以将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
此函数只能将当前线程中的对象“推”到 另一个线程,它不能从任意线程“拉”一个对象 到当前的线程。