QT:从其他线程运行独立线程

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.

pne*_*zis 5

子类化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

这个函数只能将一个对象从当前线程"推"到另一个线程,它不能将一个对象从任意线程"拉"到当前线程.