Sumo: Fix incorrect signal connection.

The signal was not connect using the std::function signalCallable.
Therefore the signal would never trigger the QEventLoop::quit() slot,
and UI would be stuck waiting for the time out.
This commit is contained in:
Kristian Bendiksen 2024-08-21 08:40:15 +02:00
parent f777dfa4ba
commit 12069ca80a
2 changed files with 26 additions and 25 deletions

View File

@ -27,6 +27,7 @@
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QMetaMethod>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QTimer> #include <QTimer>
@ -124,10 +125,9 @@ void RiaSumoConnector::requestCasesForField( const QString& fieldName )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestCasesForFieldBlocking( const QString& fieldName ) void RiaSumoConnector::requestCasesForFieldBlocking( const QString& fieldName )
{ {
auto requestCallable = [this, fieldName] { requestCasesForField( fieldName ); }; auto requestCallable = [this, fieldName] { requestCasesForField( fieldName ); };
auto signalCallable = [this]() { casesFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::casesFinished );
wrapAndCallNetworkRequest( requestCallable, signalMethod );
wrapAndCallNetworkRequest( requestCallable, signalCallable );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -160,9 +160,9 @@ void RiaSumoConnector::requestAssets()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestAssetsBlocking() void RiaSumoConnector::requestAssetsBlocking()
{ {
auto requestCallable = [this] { requestAssets(); }; auto requestCallable = [this] { requestAssets(); };
auto signalCallable = [this]() { assetsFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::assetsFinished );
wrapAndCallNetworkRequest( requestCallable, signalCallable ); wrapAndCallNetworkRequest( requestCallable, signalMethod );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -219,9 +219,9 @@ void RiaSumoConnector::requestEnsembleByCasesId( const SumoCaseId& caseId )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestEnsembleByCasesIdBlocking( const SumoCaseId& caseId ) void RiaSumoConnector::requestEnsembleByCasesIdBlocking( const SumoCaseId& caseId )
{ {
auto requestCallable = [this, caseId] { requestEnsembleByCasesId( caseId ); }; auto requestCallable = [this, caseId] { requestEnsembleByCasesId( caseId ); };
auto signalCallable = [this]() { ensembleNamesFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::ensembleNamesFinished );
wrapAndCallNetworkRequest( requestCallable, signalCallable ); wrapAndCallNetworkRequest( requestCallable, signalMethod );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -288,10 +288,9 @@ void RiaSumoConnector::requestVectorNamesForEnsemble( const SumoCaseId& caseId,
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestVectorNamesForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName ) void RiaSumoConnector::requestVectorNamesForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName )
{ {
auto requestCallable = [this, caseId, ensembleName] { requestVectorNamesForEnsemble( caseId, ensembleName ); }; auto requestCallable = [this, caseId, ensembleName] { requestVectorNamesForEnsemble( caseId, ensembleName ); };
auto signalCallable = [this]() { vectorNamesFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::vectorNamesFinished );
wrapAndCallNetworkRequest( requestCallable, signalMethod );
wrapAndCallNetworkRequest( requestCallable, signalCallable );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -352,10 +351,9 @@ void RiaSumoConnector::requestRealizationIdsForEnsemble( const SumoCaseId& caseI
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestRealizationIdsForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName ) void RiaSumoConnector::requestRealizationIdsForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName )
{ {
auto requestCallable = [this, caseId, ensembleName] { requestRealizationIdsForEnsemble( caseId, ensembleName ); }; auto requestCallable = [this, caseId, ensembleName] { requestRealizationIdsForEnsemble( caseId, ensembleName ); };
auto signalCallable = [this]() { realizationIdsFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::realizationIdsFinished );
wrapAndCallNetworkRequest( requestCallable, signalMethod );
wrapAndCallNetworkRequest( requestCallable, signalCallable );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -412,9 +410,9 @@ void RiaSumoConnector::requestBlobIdForEnsemble( const SumoCaseId& caseId, const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::requestBlobIdForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName, const QString& vectorName ) void RiaSumoConnector::requestBlobIdForEnsembleBlocking( const SumoCaseId& caseId, const QString& ensembleName, const QString& vectorName )
{ {
auto requestCallable = [this, caseId, ensembleName, vectorName] { requestBlobIdForEnsemble( caseId, ensembleName, vectorName ); }; auto requestCallable = [this, caseId, ensembleName, vectorName] { requestBlobIdForEnsemble( caseId, ensembleName, vectorName ); };
auto signalCallable = [this]() { blobIdFinished(); }; QMetaMethod signalMethod = QMetaMethod::fromSignal( &RiaSumoConnector::blobIdFinished );
wrapAndCallNetworkRequest( requestCallable, signalCallable ); wrapAndCallNetworkRequest( requestCallable, signalMethod );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -554,17 +552,20 @@ QString RiaSumoConnector::constructDownloadUrl( const QString& server, const QSt
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaSumoConnector::wrapAndCallNetworkRequest( std::function<void()> requestCallable, std::function<void()> signalCallable ) void RiaSumoConnector::wrapAndCallNetworkRequest( std::function<void()> requestCallable, const QMetaMethod& signalMethod )
{ {
QEventLoop eventLoop; QEventLoop eventLoop;
QTimer timer; QTimer timer;
timer.setSingleShot( true ); timer.setSingleShot( true );
QObject::connect( &timer, &QTimer::timeout, [] { RiaLogging::error( "Sumo request timed out." ); } );
QObject::connect( &timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit ); QObject::connect( &timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit );
// Not able to use the modern connect syntax here, as the signal is communicated as a std::function // Not able to use the modern connect syntax here, as the signal is communicated as a QMetaMethod
QObject::connect( this, SIGNAL( signalCallable ), &eventLoop, SLOT( quit() ) ); int methodIndex = eventLoop.metaObject()->indexOfMethod( "quit()" );
QMetaMethod quitMethod = eventLoop.metaObject()->method( methodIndex );
QObject::connect( this, signalMethod, &eventLoop, quitMethod );
// Call the function that will execute the request // Call the function that will execute the request
requestCallable(); requestCallable();

View File

@ -143,7 +143,7 @@ private:
static QString constructSearchUrl( const QString& server ); static QString constructSearchUrl( const QString& server );
static QString constructDownloadUrl( const QString& server, const QString& blobId ); static QString constructDownloadUrl( const QString& server, const QString& blobId );
void wrapAndCallNetworkRequest( std::function<void()> requestCallable, std::function<void()> signalCallable ); void wrapAndCallNetworkRequest( std::function<void()> requestCallable, const QMetaMethod& signalMethod );
private: private:
std::vector<SumoAsset> m_assets; std::vector<SumoAsset> m_assets;