Operasi pengatur waktu Sailfish OS dalam jangka waktu lama

Pendahuluan


Cukup sering, ketika menerapkan logika apa pun dalam aplikasi, ada kebutuhan untuk memicu fungsi tertentu setelah periode waktu tertentu. Contoh paling jelas dari kebutuhan semacam itu adalah aplikasi pengatur waktu. Misalnya, cooktimer atau Saildoro .

Seperti yang disebutkan dalam artikel sebelumnya , untuk menambahkan timer ke aplikasi di Sailfish OS, Anda dapat menggunakan elemen Timer standar atau rekan C ++-nya, QTimer . Namun, secara default, pengoperasian penghitung waktu ini ditangguhkan untuk waktu yang lama karena perangkat mungkin tertidur. Pengembang kedua aplikasi yang disebutkan di atas baru saja menghadapi masalah ini.

Artikel ini memperkenalkan standar, tetapi sayangnya cara tidak berdokumen untuk menangani perilaku OS Sailfish ini.

Titik awal


Sebagai titik awal, kami akan mempertimbangkan aplikasi "abstrak" untuk Sailfish OS, yang membutuhkan pengoperasian beberapa fungsi setelah jangka waktu yang lama. Pada saat yang sama, operasi penghitung waktu dijelaskan bukan dalam kode QML, tetapi dalam kelas C ++:

Header
 class TimerWrapper : public QObject { Q_OBJECT public: //    explicit TimerWrapper(QObject *parent = 0); ~TimerWrapper(); Q_INVOKABLE void start(int interval); //     Q_INVOKABLE void stop(); //     signals: void pomodoroFinished(int start, int end); //    void activeChanged(); //     private: QTimer *_timer; //   int _startTime; //    }; 


Sumber
 #include "timerwrapper.h" /** *  . */ TimerWrapper::TimerWrapper(QObject *parent) : QObject(parent) { _timer = new QTimer(this); //    _timer->setSingleShot(true); //     //           connect(_timer, &QTimer::timeout, [=]() { emit activeChanged(); eemit pomodoroFinished(_startTime, QDateTime::currentDateTime().toMSecsSinceEpoch()); }); } /** *  . */ TimerWrapper::~TimerWrapper() { delete _timer; _timer = nullptr; } /** *     . * @:param: interval -      */ void TimerWrapper::start(int interval) { _startTime = QDateTime::currentMSecsSinceEpoch(); //    _timer->start(interval); //   emit activeChanged(); //      } /** *    . */ void TimerWrapper::stop() { _timer->stop(); //   emit activeChanged(); //     } 


Objek kelas ini harus terdaftar di QML:

main.cpp
 #ifdef QT_QML_DEBUG #include <QtQuick> #endif #include <QGuiApplication> #include <QQmlContext> #include <QQuickView> #include <QScopedPointer> #include <sailfishapp.h> #include "timerwrapper.h" int main(int argc, char *argv[]) { //    QScopedPointer<QGuiApplication> application(SailfishApp::application(argc, argv)); //      QScopedPointer<QQuickView> view(SailfishApp::createView()); //    QScopedPointer<TimerWrapper> timer(new TimerWrapper(view.data())); //    view->rootContext()->setContextProperty("timer", timer.data()); //     QML- view->setSource(SailfishApp::pathTo("qml/harbour-application.qml")); //   view->show(); //   return application->exec(); } 


Dengan pendekatan ini, sebagaimana disebutkan dalam pendahuluan, timer dapat berhenti untuk waktu yang lama.

Solusi


Opsi pertama untuk mencegah timer tertidur diusulkan di milis pengembang dan mengakar dalam aplikasi cooktimer. Di sini diusulkan untuk secara eksplisit mengatur timer tambahan, yang satu menit sekali memanggil metode D-Bus req_display_cancel_blanking_pause untuk mencegah perangkat tertidur. Jelas, implementasi seperti itu tidak optimal dan tidak praktis. Pertama, saat menggunakan pendekatan ini, baterai perangkat lebih cepat habis. Kedua, kode minor muncul dalam proyek yang dapat dihindari.

Dan Anda dapat menghindari menggunakan kode sekunder karena Sailfish OS sudah menyediakan dua kemungkinan solusi untuk masalah ini: elemen ScreenBlank dan KeepAlive .

Menggunakan pendekatan pertama menyiratkan layar yang terus-menerus aktif. Ini adalah pendekatan yang bekerja, tetapi langsung, secara aktif mengonsumsi daya baterai perangkat. Dengan demikian, dapat digunakan, tetapi dalam berbagai situasi terbatas.

 import QtQuick 2.0 //       QML import Sailfish.Silica 1.0 //     Sailfish OS UI import Sailfish.Media 1.0 //      ScreenBlank ApplicationWindow //     { initialPage: Component { FirstPage { } } //     cover: Qt.resolvedUrl("cover/CoverPage.qml") //    ScreenBlank { //       id: screenBlank //    suspend: true //    } } 

Pada gilirannya, menggunakan elemen KeepAlive adalah pendekatan yang lebih demokratis. Pada tingkat yang lebih rendah, ia menghabiskan daya baterai, karena itu tidak membuat layar perangkat terus menyala, dan pada saat yang sama, itu juga tidak memungkinkan perangkat untuk tidur nyenyak, atau membangunkannya pada titik waktu tertentu, sehingga timer akan terus bekerja pada waktu jangka waktu yang lama.

 import QtQuick 2.0 //       QML import Sailfish.Silica 1.0 //     Sailfish OS UI import org.nemomobile.keepalive 1.1 //      KeepAlive ApplicationWindow //     { initialPage: Component { FirstPage { } } //     cover: Qt.resolvedUrl("cover/CoverPage.qml") //    KeepAlive { //       id: keepAlive //    enabled: true //       } } 

Perlu dicatat bahwa pada prinsipnya operasi ketiga metode tersebut adalah daya tarik reguler untuk metode sistem D-Bus, yang telah dibahas dalam salah satu artikel sebelumnya .

Kesimpulan


Dalam catatan singkat ini, tiga cara yang mungkin untuk mencegah perangkat agar tidak tertidur nyenyak dijelaskan. Kita dapat menyimpulkan bahwa untuk tugas-tugas latar belakang (misalnya, penghitung waktu) optimal untuk menggunakan elemen KeepAlive , dan jika ada kebutuhan untuk terus menampilkan informasi kepada pengguna, maka ScreenBlank .

Source: https://habr.com/ru/post/id413389/


All Articles