voron.run
voron.run

Reputation: 47

How qml MediaPlayer VideoOutput run in separate thread?

Suppose there is a code like this (sorry for the contrived code)

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
            }
        }
    }
}

When the number of labels increases, the video starts to break. How to start a video in a separate thread so that manipulations with any widgets do not interrupt it (video).

Upvotes: 1

Views: 1145

Answers (1)

Ihor Drachuk
Ihor Drachuk

Reputation: 1293

  1. You should not overload main thread (with it's event loop). Otherwise, whole the software will lag, not only VideoOutput.
  2. Don't move to another thread well-optimized and efficient controls. Move to another thread huge things, hard & long computations.

So

  • avoid using timers with low interval or if you use them, don't attach to them hard things

  • if you should create many or hard controls in QML, then use Loader or QQmlIncubator, they allow to create QML controls in a separate threads. Also Loader allows dynamically load and unload needed/unneeded controls. So, QML engine will not render too many controls, most of which even are not visible. Note about Loader/QQmlIncubator: they create control in a separate thread, not run it there.

  • avoid writing custom properties and functions inside QML controls, place them in some single QtObject: QtObject { id: internals; ...all your custom data... }

  • Use ListView instead of Repeater. It's more efficient because it instantiates only visible items (and several out of visible area) - probably the most important for your sample

More advice and samples you can find here:

Upvotes: 2

Related Questions