Я создал простую программу, которая воспроизводит проблему. Когда я блокирую телефон, или если я переключаюсь на другое приложение в моем телефоне Android, рабочий поток продолжает печатать, но цикл событий останавливается. Когда я возвращаюсь к своему приложению, цикл обработки событий возобновляется.
Если я заменю QGuiApplication на QCoreApplication, проблема исчезнет. Если я скомпилирую с Qt 5.2 вместо Qt 5.3, проблема исчезнет. Qt 5.4 имеет ту же проблему, что и Qt 5.3.
static int count = 0;
void workerThread()
{
while (1) {
qDebug("Worker thread %d", count++);
sleep(1);
}
}
void MyObject::step()
{
qDebug("Event loop %d", count++);
}
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
MyObject w;
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &w, SLOT(step()));
timer.start(1000);
QtConcurrent::run(workerThread);
return a.exec();
}
Как мне предотвратить QGuiApplication от остановки цикла событий, когда приложение теряет фокус? Мне нужно мое приложение для обработки событий, даже если они не на переднем плане.
Как упоминалось в моих комментариях, я создал для вас отчет об ошибках с риском быть отклоненным, но, по крайней мере, мы получим обратную связь от официальных сопровождающих.
QGuiApplication «останавливается» при блокировке телефона или переключении приложения.
Теперь он был отозван, и это достаточно справедливо, потому что, как утверждает сопровождающий, вы должны сосредоточиться на создании оказание услуг а не деятельность. Однако для этого пока нет выделенного API Qt.
Причина того, что это не очень хорошая идея для этого в действии, заключается в том, что приложение может быть уничтожено, даже мгновенно, когда оно попадает в фоновый режим. Кроме того, оно может разрядить батарею раньше, чем пользователь может этого ожидать. , это рассматривается как ошибка, а не как особенность в 5.2 сопровождающим (и), которая, кажется, была исправлена.
Здесь вы можете найти некоторую помощь по созданию сервиса на сегодняшний день: