我目前正在使用C ++ / Qt 5.9编写程序来控制3D打印机。
我已将该项目分为几个库:
我的问题是我不知道如何正确初始化和终止程序的执行。更具体地说,设备库具有名为 DeviceManager 的类,具有两个函数:
我想做的是在不阻塞GUI的情况下在正确的位置初始化设备库,然后在右边完成它而不阻塞GUI
这是我的主要代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
我现在的解决方案是在 MainWindow 构造函数中调用 DeviceManager :: initialize(),并在中调用 DeviceManager :: finalize() em> MainWindow :: closeEvent()。
问题:即使我使用并发在另一个线程中进行初始化和完成,应用程序在启动后几秒钟也会显示其窗口,并且在关闭应用程序时该屏幕会冻结,因为它必须等待完成要完成的功能。
请问我应该如何正确处理此初始化和终结问题?我是否需要重新实现QApplication类?我会尝试并主要执行吗?您知道开源应用程序执行此类初始化和完成工作的绝佳示例吗?
答案 0 :(得分:0)
问题:即使我使用并发在另一个线程中进行初始化和完成,应用程序在启动后几秒钟也会显示其窗口,并且在关闭应用程序时显示会冻结,因为它必须等待finalize函数执行完成。
在启动initialize()
之前,可以将MainWindow
函数作为自己的分离线程启动。如果初始化线程在需要第一个初始化的“事物”之前没有终止,则可能会引起问题。像这样:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
std::thread{initialize}.detach();
MainWindow w;
w.show();
finialize();
return a.exec();
}
为防止出现此问题,并可能在GUI中锁定了某些功能,则可能需要在退出时在互斥锁下设置一个状态变量,并在该互斥锁下检查该变量是否已设置。