QT: запустить независимый поток из другого потока - PullRequest
3 голосов
/ 09 ноября 2011

Позвольте мне привести пример.

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, и я не понимаю, как можно управлять всеми выполняемыми объектами (например,, остановите один из них, а затем снова запустите его) threadpool.

1 Ответ

5 голосов
/ 09 ноября 2011

Подклассы 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

эта функция может только «выдвинуть» объект из текущего потока в другой поток, он не может «вытянуть» объект из любого произвольного потока к текущей теме.

...