如何正确启动 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));
我想我在这里遗漏了一些明显的东西。
我想 运行 使用 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));