使用 Qt 5.3 或 Qt 5.4(但不是 Qt 5.2)编译时,QGuiApplication 在手机锁定时停止事件循环

Posted

技术标签:

【中文标题】使用 Qt 5.3 或 Qt 5.4(但不是 Qt 5.2)编译时,QGuiApplication 在手机锁定时停止事件循环【英文标题】:QGuiApplication stops the event-loop when phone is locked when compiled with Qt 5.3 or Qt 5.4 (but not with Qt 5.2) 【发布时间】:2014-12-13 21:24:18 【问题描述】:

我创建了一个重现问题的简单程序。当我锁定手机时,或者如果我切换到我的 android 手机中的另一个应用程序,工作线程会继续打印,但事件循环会停止。当我切换回我的应用程序时,事件循环会继续。

如果我用 QCoreApplication 替换 QGuiApplication,问题就消失了。如果我使用 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 停止事件循环?即使不在前台,我也需要我的应用来处理事件。

【问题讨论】:

能显示logcat的输出吗? sashoalm,我为您创建了一个错误报告,但请为开发人员提供有关操作系统和手机的更多详细信息:bugreports.qt-project.org/browse/QTBUG-43434 我可能还会验证应用程序状态(更改的信号等)。 @lpapp 这是 logcat 输出 - pastebin.com/1WGPYFue。 【参考方案1】:

正如我在 cmets 中提到的,我为您创建了一个错误报告,但有被拒绝的风险,但至少我们会从官方维护者那里得到反馈。

QGuiApplication "stops" when locking the phone or switching application.

它现在已经被撤回,这很公平,因为正如维护者所说,您应该专注于创建一个服务而不是活动。然而,目前还没有专门的 Qt API。

在 Activity 中这样做不是一个好主意的原因仅仅是应用程序可能会在进入“后台”时被终止,甚至是立即终止。此外,它可能会比用户预期的更早耗尽电池电量. 简而言之,这被维护者认为是一个错误而不是 5.2 中似乎已修复的功能。

您可以在此处找到一些有关如何从今天开始创建服务的帮助:

Build background service with Qt on android

【讨论】:

我明白你的意思。我想要一个简单的答案,只是为了得到一顶帽子。 :D +1 给你。 @karlphillip:脱帽致敬? ;-) 如果你的意思是冬帽,我的全部都是你的。我禁用了该功能。 正如我的“神秘消失”评论已经说过的,这不是一个错误,而是一个新功能。你太努力了……

以上是关于使用 Qt 5.3 或 Qt 5.4(但不是 Qt 5.2)编译时,QGuiApplication 在手机锁定时停止事件循环的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.3。在 QOpenGLFrameBuffer 上绘画

Qt 5.3 使用原来的QT4.8.4项目时QWebView QWebFrame

Qt 5.4 - Mac OS X 10.6 支持

如何在 Qt 5.4 应用程序中包含 QtScript 模块

连接 DLL 后出现 QT 5.4 错误

海思 3520D 移植Qt4.5.3 一