3

让我举个例子。

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,但我不明白,如何管理线程池的所有可运行对象(例如,停止其中一个,然后再次运行)。

4

1 回答 1

5

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

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

于 2011-11-09T10:30:42.070 回答