mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-03 04:16:11 +02:00
Merge bitcoin-core/gui#336: Do not exit and re-enter main event loop during shutdown
451ca244dbqt, refactor: Drop intermediate BitcoinApplication::shutdownResult slot (Hennadii Stepanov)f3a17bbe5fqt: Do not exit and re-enter main event loop during shutdown (Hennadii Stepanov)b4e0d2c431qt, refactor: Allocate SendConfirmationDialog instances on heap (Hennadii Stepanov)332dea2852qt, refactor: Keep HelpMessageDialog in the main event loop (Hennadii Stepanov)c8bae37a7aqt, refactor: Keep PSBTOperationsDialog in the main event loop (Hennadii Stepanov)7fa91e8312qt, refactor: Keep AskPassphraseDialog in the main event loop (Hennadii Stepanov)6f6fde30e7qt, refactor: Keep EditAddressDialog in the main event loop (Hennadii Stepanov)59f7ba4fd7qt, refactor: Keep CoinControlDialog in the main event loop (Hennadii Stepanov)7830cd0b35qt, refactor: Keep OptionsDialog in the main event loop (Hennadii Stepanov)13f618818dqt: Add GUIUtil::ShowModalDialogAndDeleteOnClose (Hennadii Stepanov) Pull request description: On master (1ef34ee25e) during shutdown `QApplication` exits the main event loop, then re-enter again. This PR streamlines shutdown process by removing the need to interrupt the main event loop, that is required for #59. Also, blocking [`QDialog::exec()`](https://doc.qt.io/qt-5/qdialog.html#exec) calls are replaced with safer [`QDialog::show()`](https://doc.qt.io/qt-5/qwidget.html#show), except for `SendConfirmationDialog` as that change is not trivial (marked as TODO). The [`QDialog::open()`](https://doc.qt.io/qt-5/qdialog.html#open) was not used because the actual modality mode (application modal or window modal) of a dialog depends on whether it has a parent. This PR does not change behavior, and all touched dialogs are still application modal. As a follow up, a design research could suggest to make some dialogs window modal. NOTE for reviewers: quitting app while a dialog is open (e.g., via systray icon menu) must work fine. ACKs for top commit: laanwj: Code review and lighly tested ACK451ca244dbpromag: ACK451ca244db, just changed signal to `quitRequested`. Tree-SHA512: ef01ab6ed803b202e776019a4e1f592e816f7bc786e00574b25a0bf16be2374ddf9db21f0a26da08700df7ef0ab9e879550df46dcfe3b6d940f5ed02ca5f8447
This commit is contained in:
@@ -55,6 +55,7 @@
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include <QTranslator>
|
||||
#include <QWindow>
|
||||
|
||||
#if defined(QT_STATICPLUGIN)
|
||||
#include <QtPlugin>
|
||||
@@ -259,6 +260,7 @@ void BitcoinApplication::createOptionsModel(bool resetSettings)
|
||||
void BitcoinApplication::createWindow(const NetworkStyle *networkStyle)
|
||||
{
|
||||
window = new BitcoinGUI(node(), platformStyle, networkStyle, nullptr);
|
||||
connect(window, &BitcoinGUI::quitRequested, this, &BitcoinApplication::requestShutdown);
|
||||
|
||||
pollShutdownTimer = new QTimer(window);
|
||||
connect(pollShutdownTimer, &QTimer::timeout, window, &BitcoinGUI::detectShutdown);
|
||||
@@ -296,7 +298,7 @@ void BitcoinApplication::startThread()
|
||||
|
||||
/* communication to and from thread */
|
||||
connect(&m_executor.value(), &InitExecutor::initializeResult, this, &BitcoinApplication::initializeResult);
|
||||
connect(&m_executor.value(), &InitExecutor::shutdownResult, this, &BitcoinApplication::shutdownResult);
|
||||
connect(&m_executor.value(), &InitExecutor::shutdownResult, this, &QCoreApplication::quit);
|
||||
connect(&m_executor.value(), &InitExecutor::runawayException, this, &BitcoinApplication::handleRunawayException);
|
||||
connect(this, &BitcoinApplication::requestedInitialize, &m_executor.value(), &InitExecutor::initialize);
|
||||
connect(this, &BitcoinApplication::requestedShutdown, &m_executor.value(), &InitExecutor::shutdown);
|
||||
@@ -326,13 +328,17 @@ void BitcoinApplication::requestInitialize()
|
||||
|
||||
void BitcoinApplication::requestShutdown()
|
||||
{
|
||||
for (const auto w : QGuiApplication::topLevelWindows()) {
|
||||
w->hide();
|
||||
}
|
||||
|
||||
// Show a simple window indicating shutdown status
|
||||
// Do this first as some of the steps may take some time below,
|
||||
// for example the RPC console may still be executing a command.
|
||||
shutdownWindow.reset(ShutdownWindow::showShutdownWindow(window));
|
||||
|
||||
qDebug() << __func__ << ": Requesting shutdown";
|
||||
window->hide();
|
||||
|
||||
// Must disconnect node signals otherwise current thread can deadlock since
|
||||
// no event loop is running.
|
||||
window->unsubscribeFromCoreSignals();
|
||||
@@ -409,15 +415,10 @@ void BitcoinApplication::initializeResult(bool success, interfaces::BlockAndHead
|
||||
pollShutdownTimer->start(200);
|
||||
} else {
|
||||
Q_EMIT splashFinished(); // Make sure splash screen doesn't stick around during shutdown
|
||||
quit(); // Exit first main loop invocation
|
||||
requestShutdown();
|
||||
}
|
||||
}
|
||||
|
||||
void BitcoinApplication::shutdownResult()
|
||||
{
|
||||
quit(); // Exit second main loop invocation after shutdown finished
|
||||
}
|
||||
|
||||
void BitcoinApplication::handleRunawayException(const QString &message)
|
||||
{
|
||||
QMessageBox::critical(
|
||||
@@ -639,8 +640,6 @@ int GuiMain(int argc, char* argv[])
|
||||
#if defined(Q_OS_WIN)
|
||||
WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("%1 didn't yet exit safely…").arg(PACKAGE_NAME), (HWND)app.getMainWinId());
|
||||
#endif
|
||||
app.exec();
|
||||
app.requestShutdown();
|
||||
app.exec();
|
||||
rv = app.getReturnValue();
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user