Qt qml MediaPlayer VideoOutput如何在单独的线程中运行?

Qt qml MediaPlayer VideoOutput如何在单独的线程中运行?,qt,qml,Qt,Qml,假设有这样一个代码(对不起,这是人为的代码) 当标签数量增加时,视频开始中断。如何在单独的线程中启动视频,以便对任何小部件的操作都不会中断它(视频) 您不应该重载主线程(使用它的事件循环)。否则,整个软件将滞后,不仅仅是视频输出 不要移动到另一个线程—优化良好且高效的控件。转移到另一个线程,进行大量的、艰苦的和漫长的计算 所以 避免使用间隔较短的计时器,或者如果您使用计时器,不要将其固定在硬物上 如果您应该在QML中创建多个或硬控件,那么使用Loader或QQmlIncubator,它们允许

假设有这样一个代码(对不起,这是人为的代码)

当标签数量增加时,视频开始中断。如何在单独的线程中启动视频,以便对任何小部件的操作都不会中断它(视频)

  • 您不应该重载主线程(使用它的事件循环)。否则,整个软件将滞后,不仅仅是视频输出
  • 不要移动到另一个线程—优化良好且高效的控件。转移到另一个线程,进行大量的、艰苦的和漫长的计算
  • 所以

    • 避免使用间隔较短的计时器,或者如果您使用计时器,不要将其固定在硬物上

    • 如果您应该在QML中创建多个或硬控件,那么使用
      Loader
      QQmlIncubator
      ,它们允许在单独的线程中创建QML控件。另外,
      Loader
      允许动态加载和卸载所需/不需要的控件。因此,QML引擎不会呈现太多控件,其中大部分甚至不可见。 关于
      Loader
      /
      QQmlIncubator
      :它们在单独的线程中创建控件,而不是在那里运行

    • 避免在QML控件中编写自定义属性和函数,将它们放在某个单独的QtObject:
      QtObject{id:internals;…所有自定义数据…}

    • 使用
      ListView
      而不是
      Repeater
      。它更高效,因为它只实例化可见的项目(以及一些不在可见区域内的项目)对于您的示例来说可能是最重要的

    您可以在此处找到更多建议和示例:

    • 性能注意事项和建议:
    • QML性能提示和技巧:
    • QtObject:

    如果您有XY问题,该问题与视频输出无关,如果您用另一个视觉元素替换它,并且它是交互式的(例如,一个随时改变颜色的矩形),您也应该有同样的问题。问题本身就是如何使用中继器优化标签处理,而中继器的模型有很多elements@eyllanesc对不起,我是新手。但是我是否正确地理解了您:不可能将VideoOutput分离到单独的线程中,我只需要进行优化。VideoOutput已经优化,不能在另一个线程上运行。
    Window {
        id: window
        visible: true
        width: 700
        height: 700
    
        MediaPlayer {
            id: mediaplayer
            source: "test.avi"
            autoPlay: true
        }
    
        VideoOutput {
            anchors.fill: parent
            source: mediaplayer
        }
        Repeater {
            id: repeater
            property int n: 1
            model: 1
    
            Label {
                function getRandomInt(max) {
                    return Math.floor(Math.random() * Math.floor(max))
                }
                id: label
                y: getRandomInt(window.width)
                x: getRandomInt(window.height)
                text: "label"
            }
        }
    
        Timer {
            interval: 10
            running: true
            repeat: true
    
            onTriggered: {
                repeater.n += 1
                if (!(repeater.n % 100)) {
                    repeater.model = repeater.n
                }
            }
        }
    }