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

标签 c++ qt

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

我把项目分成了几个库:

  • GUI 库: View
  • 设备库:控制每个设备(移动、打印工具、传感器)
  • Controller 库:将 View 与设备库链接起来
  • 等...

我的问题是我不知道如何正确地初始化和终止程序的执行。更具体地说,设备库有一个名为 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 类吗?我主要尝试这样做吗?您知道开源应用程序执行这种初始化和完成工作的任何很好的例子吗?

最佳答案

The problem: even if I use concurrency to initialize and finalize in a different thread, the application displays its window several seconds after it was launched and the display freezes when the application is closed because it has to wait for the finalize function to be done.

您可以在启动 MainWindow 之前将 initialize() 函数作为自己的分离线程启动。如果在需要第一个初始化的“东西”之前初始化线程没有终止,这可能会导致问题。像这样的东西:

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

    std::thread{initialize}.detach();

    MainWindow w;
    w.show();

    finialize(); 

    return a.exec();
}

为了防止这个问题,并可能锁定 GUI 中的某些功能,那么您可能需要有一个状态变量,它在退出时设置在互斥量下,并且您在互斥量下检查它是否已被设置。

关于c++ - 初始化和终止 Qt 应用程序的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837253/

相关文章:

c++ - 我在 myprogramminglab 中收到错误 "stoi is not a member of std"

c++ - 与其他重载运算符一起使用时,级联重载 cout 运算符错误 `No match`

c++ - Boost:Bootstrap.bat 编译失败以构建 bjam

qt - 在 Ubuntu 16.04 上安装 libqwt6

qt - 拖放到 QTreeView 中的 QStandardItemModel 不起作用

c++ - 你怎么知道 QMutex 是否被锁定?

linux - 符号查找错误 : ./executableName: undefined symbol :_ZN18QXmlDefaultHandlerC2Ev

c++ - cuda 上的 vector 步长加法较慢

c++ - OpenGL ES 2 如何渲染到纹理和提取数据用于 GPGPU 测试

c++ - 在不同的函数中使用相同的参数