最近我切换到了Qt5,我注意到初始化QApplication比Qt4花费的时间长得多(按分钟计算)。
对此,该项目似乎在这里花费了大量的时间:
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个值:
update()函数在init进程中被调用7次,但实际上它只是前两个非常慢的调用。
我还注意到,如果在init之前调用QCoreApplication::libraryPaths()
,那么前4个update()
调用只返回前两个路径,这解决了问题。
我现在有了一个解决方案,这是很好的,但我想了解为什么这个解决方案有效,并找到一个不那么麻烦的解决方案。
发布于 2016-02-23 04:51:48
对于一个相当普遍的问题,没有特定环境的答案是:
如何改善Qt5程序的启动时间?
..。不可能真的在这里得到。大多数Qt开发人员不会遇到这样的延迟。但我们总是可以尝试调试。因此,答案是如何调试。根据您发布的内容,代码位于:qtbase/src/gui/kernel/qplatformintegrationfactory.cpp
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++
看来,该函数名为:
QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList ¶mList, 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行放置一个断点:
if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))
然后运行程序,并调查是什么阻止插件被快速加载。从这个上下文来看,它到底是什么插件还不清楚,无论是Qt还是自定义插件。
发布于 2016-02-23 05:32:44
我不会从调试开始(因为,我冒昧地说,您可能在某个地方碰到了竞争激烈的锁,而且调试不会有多大帮助)
我建议首先对您的代码进行良好的分析,而且我对布鲁斯·道森的工具/文档没有比它更了解的了。
启动这里并继续分析应用程序
发布于 2019-08-22 21:13:51
简单回答:将二进制文件部署到子文件夹中。
很长的答案:我有同样的问题,查找Qt源代码,它会附加应用程序目录,以便查找插件。因此,除非有人执行合并请求(如果我有空余时间,我将尝试亲自完成),否则别无选择,只能将应用程序单独放在文件夹中。
https://stackoverflow.com/questions/35564370
复制相似问题