1. ホーム
  2. qt

[解決済み] Qml タイマーが正しい間隔で起動しない

2022-02-18 07:37:14

質問

タイマーのQMLアプリを作成し、Timer qmlコンポーネントを使用しています。 間隔は1000ミリ秒(デフォルト)に設定されていますが、アプリにフォーカスがあるときだけ正常に動作しているようです。 バックグラウンドに置くと、毎回トリガーされないようで、そのためにアプリにいくつかのミスが発生しました。

ドキュメントでそれに関連するものを探したのですが、見つかりませんでした。 タイマーのコードはとてもシンプルです。

Timer {
    id: timer
    repeat: true
    onTriggered: {msRemaining -= 1000; Core.secondsToText(type);}
}

どなたかそれについて、またそれを修正する方法についてご存知の方はいらっしゃいますか?

バージョンは? Qt 5.2 QML 2.0 OS X 10.9

解決するには?

QML Timer 要素は、アニメーション・タイマーと同期しています。アニメーションタイマーは通常60fpsに設定されているので、Timerの解像度はせいぜい16msとなります。また、Qt Quick 2では、アニメーションタイマーは画面の更新に同期しています(Qt Quick 1では16msにハードコードされています)。そのため、アプリがバックグラウンドで実行されると、画面更新が停止し、その結果、画面更新に同期していたタイマーが正しく動作しなくなると思われます。

タイマーを使って経過時間を表示したい場合、正確ではないので良いアイデアではありません。javascriptのDate()関数を使うとよいでしょう。

import QtQuick 2.0

Item  {
    id: root
    width: 200; height: 230

    property double startTime: 0
    property int secondsElapsed: 0

    function restartCounter()  {

            root.startTime = 0;

        }

    function timeChanged()  {
        if(root.startTime==0)
        {
            root.startTime = new Date().getTime(); //returns the number of milliseconds since the epoch (1970-01-01T00:00:00Z);
        }
        var currentTime = new Date().getTime();
        root.secondsElapsed = (currentTime-startTime)/1000;
    }

    Timer  {
        id: elapsedTimer
        interval: 1000;
        running: true;
        repeat: true;
        onTriggered: root.timeChanged()
    }

    Text {
        id: counterText
        text: root.secondsElapsed
    }
}