Code deduplication: make function in GUIUtil to get connection type to call object slot in GUI thread

with invokeMethod.
This commit is contained in:
Wladimir J. van der Laan 2012-03-24 17:07:29 +01:00
parent 55f69a4700
commit 7e7bcce2d9
3 changed files with 23 additions and 18 deletions

View file

@ -5,6 +5,7 @@
#include "clientmodel.h" #include "clientmodel.h"
#include "walletmodel.h" #include "walletmodel.h"
#include "optionsmodel.h" #include "optionsmodel.h"
#include "guiutil.h"
#include "headers.h" #include "headers.h"
#include "init.h" #include "init.h"
@ -12,7 +13,6 @@
#include <QApplication> #include <QApplication>
#include <QMessageBox> #include <QMessageBox>
#include <QThread>
#include <QTextCodec> #include <QTextCodec>
#include <QLocale> #include <QLocale>
#include <QTranslator> #include <QTranslator>
@ -70,15 +70,7 @@ bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption, wxWindo
return true; return true;
bool payFee = false; bool payFee = false;
// Call slot on GUI thread. QMetaObject::invokeMethod(guiref, "askFee", GUIUtil::blockingGUIThreadConnection(),
// If called from another thread, use a blocking QueuedConnection.
Qt::ConnectionType connectionType = Qt::DirectConnection;
if(QThread::currentThread() != QCoreApplication::instance()->thread())
{
connectionType = Qt::BlockingQueuedConnection;
}
QMetaObject::invokeMethod(guiref, "askFee", connectionType,
Q_ARG(qint64, nFeeRequired), Q_ARG(qint64, nFeeRequired),
Q_ARG(bool*, &payFee)); Q_ARG(bool*, &payFee));
@ -90,14 +82,7 @@ void ThreadSafeHandleURL(const std::string& strURL)
if(!guiref) if(!guiref)
return; return;
// Call slot on GUI thread. QMetaObject::invokeMethod(guiref, "handleURL", GUIUtil::blockingGUIThreadConnection(),
// If called from another thread, use a blocking QueuedConnection.
Qt::ConnectionType connectionType = Qt::DirectConnection;
if(QThread::currentThread() != QCoreApplication::instance()->thread())
{
connectionType = Qt::BlockingQueuedConnection;
}
QMetaObject::invokeMethod(guiref, "handleURL", connectionType,
Q_ARG(QString, QString::fromStdString(strURL))); Q_ARG(QString, QString::fromStdString(strURL)));
} }

View file

@ -17,6 +17,7 @@
#include <QClipboard> #include <QClipboard>
#include <QFileDialog> #include <QFileDialog>
#include <QDesktopServices> #include <QDesktopServices>
#include <QThread>
QString GUIUtil::dateTimeStr(qint64 nTime) QString GUIUtil::dateTimeStr(qint64 nTime)
{ {
@ -184,3 +185,14 @@ QString GUIUtil::getSaveFileName(QWidget *parent, const QString &caption,
return result; return result;
} }
Qt::ConnectionType GUIUtil::blockingGUIThreadConnection()
{
if(QThread::currentThread() != QCoreApplication::instance()->thread())
{
return Qt::BlockingQueuedConnection;
}
else
{
return Qt::DirectConnection;
}
}

View file

@ -60,6 +60,14 @@ public:
const QString &dir=QString(), const QString &filter=QString(), const QString &dir=QString(), const QString &filter=QString(),
QString *selectedSuffixOut=0); QString *selectedSuffixOut=0);
/** Get connection type to call object slot in GUI thread with invokeMethod. The call will be blocking.
@returns If called from the GUI thread, return a Qt::DirectConnection.
If called from another thread, return a Qt::BlockingQueuedConnection.
*/
static Qt::ConnectionType blockingGUIThreadConnection();
}; };
#endif // GUIUTIL_H #endif // GUIUTIL_H