i.y*_*.y. 3 qt multithreading qthread
让我举个例子.
class B : public QThread {
public:
void run() {
}
};
class A : public QThread {
public:
void run() {
b1.start(); b2.start();
}
protected:
B b1, b2;
};
Run Code Online (Sandbox Code Playgroud)
我希望A :: b1和A :: b2作为完全独立的线程运行,而不是共享父线程(A)的资源.有没有办法将主线程指定为b1和b2的父线程?
我也看过QThreadPool和QRunnable,我不明白,怎样才能管理所有runnables(例如,停止其中一个,然后再次运行)threadpool.
子类化QThread是在Qt中创建线程的错误方法.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.
};
Run Code Online (Sandbox Code Playgroud)
您可以构造线程main.cpp并将它们B作为参数传递给类.
请注意以下事项 moveToThread
这个函数只能将一个对象从当前线程"推"到另一个线程,它不能将一个对象从任意线程"拉"到当前线程.