2014-03-31 3 views
7

Я создал приложение QML с таймером, и я использую компонент qmer Timer. Интервал установлен на 1000 миллисекунд (по умолчанию) ... но он работает правильно, только когда приложение сосредоточено на нем. Когда я помещаю его в фоновом режиме, кажется, что он не запускается каждый раз, и из-за этого я получил некоторые ошибки в приложении.Таймер Qml не запускается в нужном интервале

Я пытался найти что-нибудь связанное с, что в документации, но я не мог код таймер очень прост:

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

Каждый имеет ни малейшего представления о том, что и как это исправить?

Версии: Qt 5.2 QML 2.0 OS X 10.9

ответ

8

Элемент QML Таймер синхронизирован с таймером анимации. Поскольку таймер анимации обычно установлен на 60 кадров в секунду, разрешение таймера будет в лучшем случае 16 мс. Следует также отметить, что в Qt Quick 2 таймер анимации синхронизируется с обновлением экрана (в то время как в Qt Quick 1 он жестко закодирован до 16 мс). Поэтому, когда ваше приложение работает в фоновом режиме, я думаю, что обновление остановлено, и, следовательно, ваш таймер, синхронизированный с обновлением экрана, перестанет работать правильно.

Если вы хотите показать прошедшее время с использованием таймера, как вы это сделали, это не очень хорошая идея, потому что это неточно. Вы можете использовать яваскрипт функцию 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 
    } 
} 
+0

Спасибо за ответ. Как наилучшим образом показать прошедшее время в Qt Quick 2? – danielfranca

+0

Я отредактировал ответ, который показывает пример, чтобы показать прошедшее время. – Nejat

+0

Возможно ли получить активированное событие через 5 минут, когда экран выключен? –

1

У меня есть приложение QML с помощью объекта Timer, работающие на Android:

  • С Qt 4.8, таймер работает отлично, когда приложение QML находится в фоновом режиме.

  • С Qt 5.4 таймер больше не работает, когда приложение QML находится в фоновом режиме. Например, приложение QML больше не может принимать onTriggered() сигнал. Когда приложение QML снова возвращается на передний план, таймер снова начинает работать. Похоже, что сигналы Qt блокируются, а приложение QML находится в фоновом режиме.

Так что это похоже на регресс в Qt. И лучшим решением было бы подождать, пока эта регрессия не будет исправлена.

+0

Эта регрессия, по-видимому, была исправлена ​​в версии Qt 5.5 alpha. Поэтому исправление, скорее всего, будет доступно в официальном выпуске Qt 5.5. – jonathanzh

Смежные вопросы