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

时间:2011-11-09 10:13:36

标签: multithreading qt qthread

让我举个例子。

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(例如,停止其中一个,然后再次运行)。

1 个答案:

答案 0 :(得分:5)

子类化QThread是在Qt中创建线程的wrong wayQObject提供函数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

的内容
  

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