首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改善Qt5程序的启动时间?

如何改善Qt5程序的启动时间?
EN

Stack Overflow用户
提问于 2016-02-22 21:35:37
回答 3查看 2.6K关注 0票数 4

最近我切换到了Qt5,我注意到初始化QApplication比Qt4花费的时间长得多(按分钟计算)。

对此,该项目似乎在这里花费了大量的时间:

代码语言:javascript
运行
复制
Qt5Guid.dll!QGlobalStatic<QFactoryLoader,&`anonymous namespace'::Q_QGS_directLoader::innerFunction,A0x95ca5a10::Q_QGS_directLoader::guard>::operator()() Line 129   C++
Qt5Guid.dll!QPlatformIntegrationFactory::create(const QString & platform, const QStringList & paramList, int & argc, char * * argv, const QString & platformPluginPath) Line 70 C++
Qt5Guid.dll!init_platform(const QString & pluginArgument, const QString & platformPluginPath, const QString & platformThemeName, int & argc, char * * argv) Line 1019   C++
Qt5Guid.dll!QGuiApplicationPrivate::createPlatformIntegration() Line 1176   C++
Qt5Guid.dll!QGuiApplicationPrivate::createEventDispatcher() Line 1196   C++
Qt5Widgetsd.dll!QApplicationPrivate::createEventDispatcher() Line 197   C++
Qt5Cored.dll!QCoreApplication::init() Line 769  C++
Qt5Cored.dll!QCoreApplication::QCoreApplication(QCoreApplicationPrivate & p) Line 689   C++
Qt5Guid.dll!QGuiApplication::QGuiApplication(QGuiApplicationPrivate & p) Line 570   C++
Qt5Widgetsd.dll!QApplication::QApplication(int & argc, char * * argv, int _internal) Line 569   C++

它基本上是花了几分钟,每个启动初始化windows平台插件。

我如何减少或删除这一次,谁知道原因可能是什么?

我使用QT5.5.1和VS2012 64位。

QT_QPA_PLATFORM_PLUGIN_PATH="C:\Qt-5.5.1\plugins\platforms\“编辑:不确定它是否相关,但我有,这是它如何找到平台插件的。

Edit2:进一步的调查表明,原因是在初始化程序的过程中,QFactoryLoader::update()扫描某些目录中的每个文件以寻找模式。因为该目录包括它扫描的整个程序文件(几gb)的程序目录。

路径由QCoreApplication::libraryPaths()确定,返回值有3个值:

  • C:/QT-5.5.1/插件/平台
  • C:/Qt-5.5.1/plugins
  • C:/MyProject/x64/Debug <--问题

update()函数在init进程中被调用7次,但实际上它只是前两个非常慢的调用。

我还注意到,如果在init之前调用QCoreApplication::libraryPaths(),那么前4个update()调用只返回前两个路径,这解决了问题。

我现在有了一个解决方案,这是很好的,但我想了解为什么这个解决方案有效,并找到一个不那么麻烦的解决方案。

EN

回答 3

Stack Overflow用户

发布于 2016-02-23 04:51:48

对于一个相当普遍的问题,没有特定环境的答案是:

如何改善Qt5程序的启动时间?

..。不可能真的在这里得到。大多数Qt开发人员不会遇到这样的延迟。但我们总是可以尝试调试。因此,答案是如何调试。根据您发布的内容,代码位于:qtbase/src/gui/kernel/qplatformintegrationfactory.cpp

代码语言:javascript
运行
复制
Qt5Guid.dll!QGlobalStatic<QFactoryLoader,&`anonymous namespace'::Q_QGS_directLoader::innerFunction,A0x95ca5a10::Q_QGS_directLoader::guard>::operator()() Line 129   C++
Qt5Guid.dll!QPlatformIntegrationFactory::create(const QString & platform, const QStringList & paramList, int & argc, char * * argv, const QString & platformPluginPath) Line 70 C++

看来,该函数名为:

代码语言:javascript
运行
复制
QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList &paramList, int &argc, char **argv, const QString &platformPluginPath)
{
#ifndef QT_NO_LIBRARY
    // Try loading the plugin from platformPluginPath first:
    if (!platformPluginPath.isEmpty()) {
        QCoreApplication::addLibraryPath(platformPluginPath);
        if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))
            return ret;
    }
    if (QPlatformIntegration *ret = loadIntegration(loader(), platform, paramList, argc, argv))
        return ret;
#endif
    return 0;
}

您可以指向调试Qt版本或为Qt5Guid.dll加载符号,并使Qt源代码可用于调试器和/或在用于调试项目的机器上自行构建Qt,并将可执行文件与其链接。然后在第70行放置一个断点:

代码语言:javascript
运行
复制
if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))

然后运行程序,并调查是什么阻止插件被快速加载。从这个上下文来看,它到底是什么插件还不清楚,无论是Qt还是自定义插件。

票数 1
EN

Stack Overflow用户

发布于 2016-02-23 05:32:44

我不会从调试开始(因为,我冒昧地说,您可能在某个地方碰到了竞争激烈的锁,而且调试不会有多大帮助)

我建议首先对您的代码进行良好的分析,而且我对布鲁斯·道森的工具/文档没有比它更了解的了。

启动这里并继续分析应用程序

票数 0
EN

Stack Overflow用户

发布于 2019-08-22 21:13:51

简单回答:将二进制文件部署到子文件夹中。

很长的答案:我有同样的问题,查找Qt源代码,它会附加应用程序目录,以便查找插件。因此,除非有人执行合并请求(如果我有空余时间,我将尝试亲自完成),否则别无选择,只能将应用程序单独放在文件夹中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35564370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档