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

Multithreading QT:从其他线程运行独立线程,multithreading,qt,qthread,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的父线程 我还研究了QThr

让我给你举个例子

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的所有可运行项(例如,停止其中一个,然后再次运行)。子类化
QThread
是在Qt中创建线程的关键
QObject
提供了一个函数,该函数只允许您更改对象及其子对象的线程关联性

更改此对象及其子对象的线程关联性。这个 如果对象具有父对象,则无法移动该对象。事件处理将 在targetThread中继续

要将对象移动到主线程,请使用QApplication::instance()来 检索指向当前应用程序的指针,然后使用 QApplication::thread()检索应用程序所在的线程 生命

因此,您应该做的是继承
QObject
而不是
QThread
,并更改run函数以将B对象移动到其他线程

示例代码(未测试)

您可以在
main.cpp
中构造线程,并将它们作为参数传递给
B

请注意以下关于
moveToThread

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


我不认为我有这个特定技术的解决方案,但是在大多数技术中,线程可以被指定为守护进程,在这种情况下,当父线程被终止时,它就会被终止。希望这是一个开始…看起来我犯了一个愚蠢的错误:我调用了run()而不是start()。现在看起来一切正常,CPU已满负荷:)
当我按下按钮时,界面就冻结了。好像有什么不对劲
并说
“void QThread::start(Priority Priority=InheritPriority)[slot]通过调用run()开始线程的执行,应在QThread子类中重新实现以包含代码。操作系统将根据优先级参数计划线程。如果线程已在运行,则此函数不执行任何操作。“
为什么子类化QThread是错误的?wtf对此有注释?缺少换行符真是太愚蠢了。同时,QT官方文档说,可以将QThread子类化。您也不能从外部使线程睡眠:QThread::sleep()受保护
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.
};