mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-11-17 00:07:51 +00:00
Daemon manager improvements
This commit is contained in:
parent
ce10016408
commit
2ed59f41ed
4 changed files with 83 additions and 15 deletions
6
main.qml
6
main.qml
|
@ -235,7 +235,6 @@ ApplicationWindow {
|
|||
}
|
||||
|
||||
function connectWallet(wallet) {
|
||||
showProcessingSplash("Please wait...")
|
||||
currentWallet = wallet
|
||||
updateSyncing(false)
|
||||
|
||||
|
@ -341,9 +340,6 @@ ApplicationWindow {
|
|||
|
||||
function onWalletRefresh() {
|
||||
console.log(">>> wallet refreshed")
|
||||
if (splash.visible) {
|
||||
hideProcessingSplash()
|
||||
}
|
||||
|
||||
// Daemon connected
|
||||
leftPanel.networkStatus.connected = currentWallet.connected()
|
||||
|
@ -398,6 +394,7 @@ ApplicationWindow {
|
|||
console.log("daemon started");
|
||||
daemonRunning = true;
|
||||
hideProcessingSplash();
|
||||
currentWallet.connected(true);
|
||||
}
|
||||
function onDaemonStopped(){
|
||||
console.log("daemon stopped");
|
||||
|
@ -1233,6 +1230,7 @@ ApplicationWindow {
|
|||
}
|
||||
onClosing: {
|
||||
// Close wallet non async on exit
|
||||
daemonManager.exit();
|
||||
walletManager.closeWallet();
|
||||
}
|
||||
|
||||
|
|
|
@ -407,7 +407,7 @@ Rectangle {
|
|||
console.log("Settings page loaded");
|
||||
initSettings();
|
||||
viewOnly = currentWallet.viewOnly;
|
||||
daemonManager.running(persistentSettings.testnet)
|
||||
appWindow.daemonRunning = daemonManager.running(persistentSettings.testnet)
|
||||
}
|
||||
|
||||
// fires only once
|
||||
|
|
|
@ -67,11 +67,22 @@ bool DaemonManager::start(const QString &flags, bool testnet)
|
|||
// add state changed listener
|
||||
connect(m_daemon,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(stateChanged(QProcess::ProcessState)));
|
||||
|
||||
if (!started) {
|
||||
if (!started)
|
||||
qDebug() << "Daemon start error: " + m_daemon->errorString();
|
||||
} else {
|
||||
emit daemonStarted();
|
||||
}
|
||||
|
||||
// Start start watcher
|
||||
QFuture<bool> future = QtConcurrent::run(this, &DaemonManager::startWatcher, testnet);
|
||||
QFutureWatcher<bool> * watcher = new QFutureWatcher<bool>();
|
||||
connect(watcher, &QFutureWatcher<bool>::finished,
|
||||
this, [this, watcher]() {
|
||||
QFuture<bool> future = watcher->future();
|
||||
watcher->deleteLater();
|
||||
if(future.result()) {
|
||||
emit daemonStarted();
|
||||
}
|
||||
});
|
||||
watcher->setFuture(future);
|
||||
|
||||
|
||||
return started;
|
||||
}
|
||||
|
@ -79,13 +90,63 @@ bool DaemonManager::start(const QString &flags, bool testnet)
|
|||
bool DaemonManager::stop(bool testnet)
|
||||
{
|
||||
QString message;
|
||||
bool stopped = sendCommand("exit",testnet,message);
|
||||
sendCommand("exit",testnet,message);
|
||||
qDebug() << message;
|
||||
if(stopped)
|
||||
emit daemonStopped();
|
||||
return stopped;
|
||||
|
||||
// Start stop watcher - Will kill if not shutting down
|
||||
QFuture<bool> future = QtConcurrent::run(this, &DaemonManager::stopWatcher, testnet);
|
||||
QFutureWatcher<bool> * watcher = new QFutureWatcher<bool>();
|
||||
connect(watcher, &QFutureWatcher<bool>::finished,
|
||||
this, [this, watcher]() {
|
||||
QFuture<bool> future = watcher->future();
|
||||
watcher->deleteLater();
|
||||
if(future.result()) {
|
||||
emit daemonStopped();
|
||||
}
|
||||
});
|
||||
watcher->setFuture(future);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DaemonManager::startWatcher(bool testnet) const
|
||||
{
|
||||
// Check if daemon is started every 2 seconds
|
||||
while(true && !m_app_exit) {
|
||||
QThread::sleep(2);
|
||||
if(!running(testnet)) {
|
||||
qDebug() << "daemon not running. checking again in 2 seconds.";
|
||||
} else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DaemonManager::stopWatcher(bool testnet) const
|
||||
{
|
||||
// Check if daemon is running every 2 seconds. Kill if still running after 10 seconds
|
||||
int counter = 0;
|
||||
while(true && !m_app_exit) {
|
||||
QThread::sleep(2);
|
||||
counter++;
|
||||
if(running(testnet)) {
|
||||
qDebug() << "Daemon still running. " << counter;
|
||||
if(counter >= 5) {
|
||||
qDebug() << "Killing it! ";
|
||||
#ifdef Q_OS_WIN
|
||||
QProcess::execute("taskkill /F /IM monerod.exe");
|
||||
#else
|
||||
QProcess::execute("pkill monerod");
|
||||
#endif
|
||||
}
|
||||
|
||||
} else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void DaemonManager::stateChanged(QProcess::ProcessState state)
|
||||
{
|
||||
qDebug() << "STATE CHANGED: " << state;
|
||||
|
@ -124,10 +185,8 @@ bool DaemonManager::running(bool testnet) const
|
|||
// `./monerod status` returns BUSY when syncing.
|
||||
// Treat busy as connected, until fixed upstream.
|
||||
if (status.contains("Height:") || status.contains("BUSY") ) {
|
||||
emit daemonStarted();
|
||||
return true;
|
||||
}
|
||||
emit daemonStopped();
|
||||
return false;
|
||||
}
|
||||
bool DaemonManager::sendCommand(const QString &cmd,bool testnet) const
|
||||
|
@ -155,6 +214,12 @@ bool DaemonManager::sendCommand(const QString &cmd,bool testnet, QString &messag
|
|||
return started;
|
||||
}
|
||||
|
||||
void DaemonManager::exit()
|
||||
{
|
||||
qDebug("DaemonManager: exit()");
|
||||
m_app_exit = true;
|
||||
}
|
||||
|
||||
DaemonManager::DaemonManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
|
|
|
@ -20,9 +20,13 @@ public:
|
|||
Q_INVOKABLE bool running(bool testnet) const;
|
||||
// Send daemon command from qml and prints output in console window.
|
||||
Q_INVOKABLE bool sendCommand(const QString &cmd, bool testnet) const;
|
||||
Q_INVOKABLE void exit();
|
||||
|
||||
private:
|
||||
|
||||
bool sendCommand(const QString &cmd, bool testnet, QString &message) const;
|
||||
bool startWatcher(bool testnet) const;
|
||||
bool stopWatcher(bool testnet) const;
|
||||
signals:
|
||||
void daemonStarted() const;
|
||||
void daemonStopped() const;
|
||||
|
@ -41,6 +45,7 @@ private:
|
|||
bool initialized = false;
|
||||
QString m_monerod;
|
||||
bool m_has_daemon = true;
|
||||
bool m_app_exit = false;
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue