From 723035bb6839c5d65bfee96d501a8c54814778e3 Mon Sep 17 00:00:00 2001 From: Gavin Andresen Date: Sat, 23 Mar 2013 18:14:12 -0400 Subject: [PATCH] Have Qt poll for shutdown requested, the QT way. --- src/init.cpp | 8 ++++++-- src/init.h | 1 + src/qt/bitcoin.cpp | 12 ++++++------ src/qt/bitcoingui.cpp | 7 +++++++ src/qt/bitcoingui.h | 3 +++ src/ui_interface.h | 3 --- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 3ccd01e3b..ee69d2207 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -61,8 +61,8 @@ enum BindFlags { // immediately and the parent exits from main(). // // Shutdown for Qt is very similar, only it uses a QTimer to detect -// fRequestShutdown getting set (either by RPC stop or SIGTERM) -// and then does the normal Qt shutdown thing. +// fRequestShutdown getting set, and then does the normal Qt +// shutdown thing. // volatile bool fRequestShutdown = false; @@ -71,6 +71,10 @@ void StartShutdown() { fRequestShutdown = true; } +bool ShutdownRequested() +{ + return fRequestShutdown; +} static CCoinsViewDB *pcoinsdbview; diff --git a/src/init.h b/src/init.h index 2968ca561..5927670c8 100644 --- a/src/init.h +++ b/src/init.h @@ -10,6 +10,7 @@ extern CWallet* pwalletMain; void StartShutdown(); +bool ShutdownRequested(); void Shutdown(); bool AppInit2(boost::thread_group& threadGroup); std::string HelpMessage(); diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index b61921fca..f079f3b0e 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -88,11 +88,6 @@ static void InitMessage(const std::string &message) printf("init message: %s\n", message.c_str()); } -static void QueueShutdown() -{ - QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); -} - /* Translate string to current locale using Qt. */ @@ -186,7 +181,6 @@ int main(int argc, char *argv[]) uiInterface.ThreadSafeMessageBox.connect(ThreadSafeMessageBox); uiInterface.ThreadSafeAskFee.connect(ThreadSafeAskFee); uiInterface.InitMessage.connect(InitMessage); - uiInterface.QueueShutdown.connect(QueueShutdown); uiInterface.Translate.connect(Translate); // Show help message immediately after parsing command-line options (for "-lang") and setting locale, @@ -217,8 +211,14 @@ int main(int argc, char *argv[]) GUIUtil::SetStartOnSystemStartup(true); boost::thread_group threadGroup; + BitcoinGUI window; guiref = &window; + + QTimer* pollShutdownTimer = new QTimer(guiref); + QObject::connect(pollShutdownTimer, SIGNAL(timeout()), guiref, SLOT(detectShutdown())); + pollShutdownTimer->start(200); + if(AppInit2(threadGroup)) { { diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index adc6cd474..9da5b8500 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -24,6 +24,7 @@ #include "rpcconsole.h" #include "ui_interface.h" #include "wallet.h" +#include "init.h" #ifdef Q_OS_MAC #include "macdockiconhandler.h" @@ -839,3 +840,9 @@ void BitcoinGUI::toggleHidden() { showNormalIfMinimized(true); } + +void BitcoinGUI::detectShutdown() +{ + if (ShutdownRequested()) + QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); +} diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 8f44389fd..aba81cb3b 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -199,6 +199,9 @@ private slots: void showNormalIfMinimized(bool fToggleHidden = false); /** Simply calls showNormalIfMinimized(true) for use in SLOT() macro */ void toggleHidden(); + + /** called by a timer to check if fRequestShutdown has been set **/ + void detectShutdown(); }; #endif // BITCOINGUI_H diff --git a/src/ui_interface.h b/src/ui_interface.h index f7dbe2089..5b0555c10 100644 --- a/src/ui_interface.h +++ b/src/ui_interface.h @@ -79,9 +79,6 @@ public: /** Progress message during initialization. */ boost::signals2::signal InitMessage; - /** Initiate client shutdown. */ - boost::signals2::signal QueueShutdown; - /** Translate a message to the native language of the user. */ boost::signals2::signal Translate;