WindowManager: move Wallet cleanup to different thread

This commit is contained in:
tobtoht 2021-07-03 03:29:13 +02:00
parent 2d07483577
commit 9fb734607e
No known key found for this signature in database
GPG key ID: 1CADD27F41F45C3C
8 changed files with 40 additions and 23 deletions

View file

@ -368,8 +368,8 @@ void MainWindow::initWalletContext() {
connect(m_ctx->nodes, &Nodes::WSNodeExhausted, this, &MainWindow::showWSNodeExhaustedMessage); connect(m_ctx->nodes, &Nodes::WSNodeExhausted, this, &MainWindow::showWSNodeExhaustedMessage);
// Wallet // Wallet
connect(m_ctx->wallet.get(), &Wallet::connectionStatusChanged, this, &MainWindow::onConnectionStatusChanged); connect(m_ctx->wallet, &Wallet::connectionStatusChanged, this, &MainWindow::onConnectionStatusChanged);
connect(m_ctx->wallet.get(), &Wallet::currentSubaddressAccountChanged, this, &MainWindow::updateTitle); connect(m_ctx->wallet, &Wallet::currentSubaddressAccountChanged, this, &MainWindow::updateTitle);
} }
void MainWindow::menuToggleTabVisible(const QString &key){ void MainWindow::menuToggleTabVisible(const QString &key){
@ -714,7 +714,7 @@ void MainWindow::showConnectionStatusDialog() {
} }
void MainWindow::showPasswordDialog() { void MainWindow::showPasswordDialog() {
PasswordChangeDialog dialog{this, m_ctx->wallet.get()}; PasswordChangeDialog dialog{this, m_ctx->wallet};
dialog.exec(); dialog.exec();
this->updatePasswordIcon(); this->updatePasswordIcon();
} }
@ -790,12 +790,12 @@ void MainWindow::menuSettingsClicked() {
} }
void MainWindow::menuSignVerifyClicked() { void MainWindow::menuSignVerifyClicked() {
SignVerifyDialog dialog{m_ctx->wallet.get(), this}; SignVerifyDialog dialog{m_ctx->wallet, this};
dialog.exec(); dialog.exec();
} }
void MainWindow::menuVerifyTxProof() { void MainWindow::menuVerifyTxProof() {
VerifyProofDialog dialog{m_ctx->wallet.get(), this}; VerifyProofDialog dialog{m_ctx->wallet, this};
dialog.exec(); dialog.exec();
} }
@ -845,6 +845,7 @@ void MainWindow::closeEvent(QCloseEvent *event) {
m_txTimer.stop(); m_txTimer.stop();
this->saveGeo(); this->saveGeo();
m_ctx->stopTimers();
m_windowManager->closeWindow(this); m_windowManager->closeWindow(this);
} }
@ -1175,7 +1176,7 @@ void MainWindow::rescanSpent() {
} }
void MainWindow::showBalanceDialog() { void MainWindow::showBalanceDialog() {
BalanceDialog dialog{this, m_ctx->wallet.get()}; BalanceDialog dialog{this, m_ctx->wallet};
dialog.exec(); dialog.exec();
} }

View file

@ -179,6 +179,8 @@ private slots:
void onSetStatusText(const QString &text); void onSetStatusText(const QString &text);
private: private:
friend WindowManager;
void initStatusBar(); void initStatusBar();
void initWidgets(); void initWidgets();
void initMenu(); void initMenu();

View file

@ -17,6 +17,7 @@
WindowManager::WindowManager() { WindowManager::WindowManager() {
m_walletManager = WalletManager::instance(); m_walletManager = WalletManager::instance();
m_splashDialog = new SplashDialog; m_splashDialog = new SplashDialog;
m_cleanupThread = new QThread();
connect(m_walletManager, &WalletManager::walletOpened, this, &WindowManager::onWalletOpened); connect(m_walletManager, &WalletManager::walletOpened, this, &WindowManager::onWalletOpened);
connect(m_walletManager, &WalletManager::walletCreated, this, &WindowManager::onWalletCreated); connect(m_walletManager, &WalletManager::walletCreated, this, &WindowManager::onWalletCreated);
@ -68,6 +69,11 @@ void WindowManager::close() {
void WindowManager::closeWindow(MainWindow *window) { void WindowManager::closeWindow(MainWindow *window) {
m_windows.removeOne(window); m_windows.removeOne(window);
// Move Wallet to a different thread for cleanup so it doesn't block GUI thread
window->m_ctx->wallet->moveToThread(m_cleanupThread);
m_cleanupThread->start();
window->m_ctx->wallet->deleteLater();
} }
void WindowManager::restartApplication(const QString &binaryFilename) { void WindowManager::restartApplication(const QString &binaryFilename) {

View file

@ -77,6 +77,8 @@ private:
bool m_openWalletTriedOnce = false; bool m_openWalletTriedOnce = false;
bool m_openingWallet = false; bool m_openingWallet = false;
bool m_initialNetworkConfigured = false; bool m_initialNetworkConfigured = false;
QThread *m_cleanupThread;
}; };

View file

@ -27,22 +27,22 @@ AppContext::AppContext(Wallet *wallet)
, networkType(constants::networkType) , networkType(constants::networkType)
, m_rpc(new DaemonRpc{this, getNetworkTor(), ""}) , m_rpc(new DaemonRpc{this, getNetworkTor(), ""})
{ {
connect(this->wallet.get(), &Wallet::moneySpent, this, &AppContext::onMoneySpent); connect(this->wallet, &Wallet::moneySpent, this, &AppContext::onMoneySpent);
connect(this->wallet.get(), &Wallet::moneyReceived, this, &AppContext::onMoneyReceived); connect(this->wallet, &Wallet::moneyReceived, this, &AppContext::onMoneyReceived);
connect(this->wallet.get(), &Wallet::unconfirmedMoneyReceived, this, &AppContext::onUnconfirmedMoneyReceived); connect(this->wallet, &Wallet::unconfirmedMoneyReceived, this, &AppContext::onUnconfirmedMoneyReceived);
connect(this->wallet.get(), &Wallet::newBlock, this, &AppContext::onWalletNewBlock); connect(this->wallet, &Wallet::newBlock, this, &AppContext::onWalletNewBlock);
connect(this->wallet.get(), &Wallet::updated, this, &AppContext::onWalletUpdate); connect(this->wallet, &Wallet::updated, this, &AppContext::onWalletUpdate);
connect(this->wallet.get(), &Wallet::refreshed, this, &AppContext::onWalletRefreshed); connect(this->wallet, &Wallet::refreshed, this, &AppContext::onWalletRefreshed);
connect(this->wallet.get(), &Wallet::transactionCommitted, this, &AppContext::onTransactionCommitted); connect(this->wallet, &Wallet::transactionCommitted, this, &AppContext::onTransactionCommitted);
connect(this->wallet.get(), &Wallet::heightRefreshed, this, &AppContext::onHeightRefreshed); connect(this->wallet, &Wallet::heightRefreshed, this, &AppContext::onHeightRefreshed);
connect(this->wallet.get(), &Wallet::transactionCreated, this, &AppContext::onTransactionCreated); connect(this->wallet, &Wallet::transactionCreated, this, &AppContext::onTransactionCreated);
connect(this->wallet.get(), &Wallet::deviceError, this, &AppContext::onDeviceError); connect(this->wallet, &Wallet::deviceError, this, &AppContext::onDeviceError);
connect(this->wallet.get(), &Wallet::deviceButtonRequest, this, &AppContext::onDeviceButtonRequest); connect(this->wallet, &Wallet::deviceButtonRequest, this, &AppContext::onDeviceButtonRequest);
connect(this->wallet.get(), &Wallet::deviceButtonPressed, this, &AppContext::onDeviceButtonPressed); connect(this->wallet, &Wallet::deviceButtonPressed, this, &AppContext::onDeviceButtonPressed);
connect(this->wallet.get(), &Wallet::connectionStatusChanged, [this]{ connect(this->wallet, &Wallet::connectionStatusChanged, [this]{
this->nodes->autoConnect(); this->nodes->autoConnect();
}); });
connect(this->wallet.get(), &Wallet::currentSubaddressAccountChanged, [this]{ connect(this->wallet, &Wallet::currentSubaddressAccountChanged, [this]{
this->updateBalance(); this->updateBalance();
}); });
@ -273,6 +273,10 @@ void AppContext::onOpenAliasResolve(const QString &openAlias) {
emit openAliasResolveError(msg); emit openAliasResolveError(msg);
} }
void AppContext::stopTimers() {
m_storeTimer.stop();
}
// ########################################## LIBWALLET QT SIGNALS #################################################### // ########################################## LIBWALLET QT SIGNALS ####################################################
void AppContext::onMoneySpent(const QString &txId, quint64 amount) { void AppContext::onMoneySpent(const QString &txId, quint64 amount) {

View file

@ -25,7 +25,7 @@ Q_OBJECT
public: public:
explicit AppContext(Wallet *wallet); explicit AppContext(Wallet *wallet);
QScopedPointer<Wallet> wallet; Wallet *wallet;
Nodes *nodes; Nodes *nodes;
bool donationSending = false; bool donationSending = false;
@ -46,6 +46,8 @@ public:
void storeWallet(); void storeWallet();
void stopTimers();
public slots: public slots:
void onCreateTransaction(const QString &address, quint64 amount, const QString &description, bool all); void onCreateTransaction(const QString &address, quint64 amount, const QString &description, bool all);
void onCreateTransactionMultiDest(const QVector<QString> &addresses, const QVector<quint64> &amounts, const QString &description); void onCreateTransactionMultiDest(const QVector<QString> &addresses, const QVector<quint64> &amounts, const QString &description);

View file

@ -45,7 +45,7 @@ AccountSwitcherDialog::AccountSwitcherDialog(QSharedPointer<AppContext> ctx, QWi
m_ctx->wallet->subaddressAccount()->refresh(); m_ctx->wallet->subaddressAccount()->refresh();
}); });
connect(m_ctx->wallet.get(), &Wallet::currentSubaddressAccountChanged, this, &AccountSwitcherDialog::updateSelection); connect(m_ctx->wallet, &Wallet::currentSubaddressAccountChanged, this, &AccountSwitcherDialog::updateSelection);
connect(m_ctx->wallet->subaddressAccount(), &SubaddressAccount::refreshFinished, this, &AccountSwitcherDialog::updateSelection); connect(m_ctx->wallet->subaddressAccount(), &SubaddressAccount::refreshFinished, this, &AccountSwitcherDialog::updateSelection);
this->updateSelection(); this->updateSelection();

View file

@ -30,7 +30,7 @@ TxInfoDialog::TxInfoDialog(QSharedPointer<AppContext> ctx, TransactionInfo *txIn
connect(ui->btn_CopyTxKey, &QPushButton::pressed, this, &TxInfoDialog::copyTxKey); connect(ui->btn_CopyTxKey, &QPushButton::pressed, this, &TxInfoDialog::copyTxKey);
connect(ui->btn_createTxProof, &QPushButton::pressed, this, &TxInfoDialog::createTxProof); connect(ui->btn_createTxProof, &QPushButton::pressed, this, &TxInfoDialog::createTxProof);
connect(m_ctx->wallet.get(), &Wallet::newBlock, this, &TxInfoDialog::updateData); connect(m_ctx->wallet, &Wallet::newBlock, this, &TxInfoDialog::updateData);
this->setData(txInfo); this->setData(txInfo);