初始化和终止Qt应用程序的正确方法?

时间:2018-08-14 08:42:45

标签: c++ qt

我目前正在使用C ++ / Qt 5.9编写程序来控制3D打印机。

我已将该项目分为几个库:

  • GUI库:视图
  • 设备库:控制每个设备(运动,打印工具,传感器)
  • 控制器库:将视图与设备库链接
  • 等...

我的问题是我不知道如何正确初始化和终止程序的执行。更具体地说,设备库具有名为 DeviceManager 的类,具有两个函数:

  • initialize():连接到每个设备并对其进行初始化。 此操作可能需要几秒钟(例如10秒钟)
  • finalize():关闭所有连接,也可能需要几秒钟

我想做的是在不阻塞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类?我会尝试并主要执行吗?您知道开源应用程序执行此类初始化和完成工作的绝佳示例吗?

1 个答案:

答案 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中锁定了某些功能,则可能需要在退出时在互斥锁下设置一个状态变量,并在该互斥锁下检查该变量是否已设置。