I'm trying to pause the rendering in a Qt app on android when put into background. After the initial state change, the app is stuck as no updates reach the connection.
QScopedPointer<QQuickWindow> window ...
QSemaphore renderSemaphore(1);
bool releaseOnRender {};
QObject::connect(window.data(), &QQuickWindow::beforeRendering,
qApp, [&] {
releaseOnRender = renderSemaphore.tryAcquire(1, -1);
}, Qt::DirectConnection);
QObject::connect(window.data(), &QQuickWindow::afterRendering,
qApp, [&] {
if (releaseOnRender) {
renderSemaphore.release(1);
}
}, Qt::DirectConnection);
Qt::ApplicationState prevApplicationState = Qt::ApplicationState::ApplicationActive;
QObject::connect(qApp, &QGuiApplication::applicationStateChanged,
qApp, [&] (Qt::ApplicationState state) {
qDebug() << "Changed state to" << state;
if (state != prevApplicationState) {
if (state == Qt::ApplicationState::ApplicationSuspended) {
renderSemaphore.acquire(1);
qDebug() << "Freezing render";
} else {
renderSemaphore.release(1);
qDebug() << "Releasing render";
}
prevApplicationState = state;
}
}, Qt::DirectConnection);
My implementation stems from the suggestion for a related question.
Is there any chance to achieve this? Perhaps using a different approach?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…