如何正确启动 QThread

How to launch a QThread correctly

我想我在这里遗漏了一些明显的东西。

我想 运行 使用 QT Eventloop 进行 GTest。对于 运行 的 QT Eventloop,我必须启动 QApplication。

然后 GTEST RUN_ALL_TESTS 应该在新创建的 QThread 中启动。

/**
 * @brief Executes GTest. After Executing GTest it will stop the QApllication
*/
static void ExecuteGTest();


int main(int argc, char* argv[])
{

  ::testing::InitGoogleTest(&argc, argv);
  QGuiApplication app(argc, argv);

  auto pGTest = std::make_unique<QThread>(QThread::create(ExecuteGTest));
  pGTest->start();
  const int iGTestRes = app.exec();
  return iGTestRes;
}

static void ExecuteGTest()
{
  const int iRes = RUN_ALL_TESTS();
  //terminate the Qt Eventloop and return GTest Result
  QCoreApplication::exit(iRes);
}

但是 ExecuteGTest() 永远不会执行。我在这里错过了什么?你能帮帮我吗?

我认为问题在于语句...

auto pGTest = std::make_unique<QThread>(QThread::create(ExecuteGTest));

一般来说一个表达式...

std::make_unique<T>(args...)

将创建一个 std::unique_ptr<T>,其中 T 的实例根据...

构建
T(args...)

因此在这种情况下,您实际上将调用接受 QObject * 作为其父对象的 QThread constructor...

QThread::QThread(QObject *parent = nullptr)

当您随后调用 pGTest->start() 时,您实际上是在 QThread::create(ExecuteGTest) 创建的 QThread 的子对象上调用 start

尝试将上述语句更改为...

std::unique_ptr<QThread> pGTest(QThread::create(ExecuteGTest));