Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加载主QT/QML GUI窗口会减慢启动屏幕的渲染速度_C++_Multithreading_Qt_Splash Screen - Fatal编程技术网

C++ 加载主QT/QML GUI窗口会减慢启动屏幕的渲染速度

C++ 加载主QT/QML GUI窗口会减慢启动屏幕的渲染速度,c++,multithreading,qt,splash-screen,C++,Multithreading,Qt,Splash Screen,我正在使用C++/Qt/QML堆栈开发GUI应用程序 在应用程序启动时,我有一个启动屏幕,在主窗口加载时显示。我希望启动屏幕提供主窗口加载状态的更新(比方说,每200毫秒更新一次) 但是,加载主窗口会导致启动屏幕的200ms“this is the update”(这是更新)渲染中断。降低启动屏幕速度的代码是: this->engine = new QQmlApplicationEngine; engine->load(QUrl("qrc:/mainWindow.qml")); //

我正在使用C++/Qt/QML堆栈开发GUI应用程序

在应用程序启动时,我有一个启动屏幕,在主窗口加载时显示。我希望启动屏幕提供主窗口加载状态的更新(比方说,每200毫秒更新一次)

但是,加载主窗口会导致启动屏幕的200ms“this is the update”(这是更新)渲染中断。降低启动屏幕速度的代码是:

this->engine = new QQmlApplicationEngine;
engine->load(QUrl("qrc:/mainWindow.qml")); // This line causes splash screen rendering to lag!
所以我想,好吧,我将把启动屏幕进程放到一个优先级更高的线程中,这样它的渲染/更新进程就不会被“as”中断

但是…我发现所有的
QQmlApplicationEngine
对象都必须在同一个线程中创建/使用,即
QApplication
中创建的对象(单例)

我知道如果我有大量的计算操作,我可以把它们放到一个工作线程中,但是这个场景有点不同,因为导致延迟的是一个GUI方法调用,Qt不允许在一个单独的线程中

有了这个限制,我怎样才能实现我想要的呢?

只是一个想法(在阅读了源代码和文档之后),而不是一个经过测试的解决方案:

将QQmlEngine和QQmlComponent组合在一起,以提供加载单个QML文件的方便方法

QQmlComponent提供可用于更新初始屏幕的信号

如果您可以将QQmlApplicationEngine分离到QQmlComponent中,首先加载一个QML(使用progressChanged()或a来更新初始屏幕),然后将其放入Qqmlingine(模仿QQmlApplicationEngine C:\Qt\5.4\Src\qtdeclarative\Src\QML\qmlApplicationEngine.cpp的方式),我希望您能够实现您想要的目标

另外,当您执行所有这些操作时,您的主循环应该已经运行,以便使信号工作。

只是一个想法(在阅读源代码和文档之后),而不是经过测试的解决方案:

将QQmlEngine和QQmlComponent组合在一起,以提供加载单个QML文件的方便方法

QQmlComponent提供可用于更新初始屏幕的信号

如果您可以将QQmlApplicationEngine分离到QQmlComponent中,首先加载一个QML(使用progressChanged()或a来更新初始屏幕),然后将其放入Qqmlingine(模仿QQmlApplicationEngine C:\Qt\5.4\Src\qtdeclarative\Src\QML\qmlApplicationEngine.cpp的方式),我希望您能够实现您想要的目标


另外,当您执行所有这些操作时,您的主循环应该已经在运行,以便使信号工作。

您可以使用自己的引擎,而不是使用
QQmlApplicationEngine
的引擎。您当然可以在另一个线程中加载所有内容,然后将整个引擎返回到主线程并在那里开始渲染。如果有
Window
对象,请确保所有窗口都不可见。

您可以使用自己的引擎,而不是使用
qqqmlapplicationengine
的引擎。您当然可以在另一个线程中加载所有内容,然后将整个引擎返回到主线程并在那里开始渲染。如果你有
Window
对象,只需确保所有窗口都不可见。

谢谢你的想法,我会在几天后回家后试用!谢谢你的想法,我会在几天内尝试一下,一旦我回家!“使用您自己的引擎”是什么意思?@gbmhunter实例化一个
QQmlEngine
并使用它。您所说的“使用您自己的引擎”是什么意思?@gbmhunter实例化一个
QQmlEngine
并使用它。