diff --git a/libdiscover/resources/ResourcesModel.h b/libdiscover/resources/ResourcesModel.h --- a/libdiscover/resources/ResourcesModel.h +++ b/libdiscover/resources/ResourcesModel.h @@ -122,6 +122,7 @@ int m_initializingBackends; QAction* m_updateAction = nullptr; AbstractResourcesBackend* m_currentApplicationBackend; + QTimer* m_allInitializedEmitter; static ResourcesModel* s_self; }; diff --git a/libdiscover/resources/ResourcesModel.cpp b/libdiscover/resources/ResourcesModel.cpp --- a/libdiscover/resources/ResourcesModel.cpp +++ b/libdiscover/resources/ResourcesModel.cpp @@ -53,6 +53,7 @@ , m_isFetching(false) , m_initializingBackends(0) , m_currentApplicationBackend(nullptr) + , m_allInitializedEmitter(new QTimer(this)) { init(load); connect(this, &ResourcesModel::allInitialized, this, &ResourcesModel::slotFetching); @@ -64,6 +65,13 @@ Q_ASSERT(!s_self); Q_ASSERT(QCoreApplication::instance()->thread()==QThread::currentThread()); + m_allInitializedEmitter->setSingleShot(true); + m_allInitializedEmitter->setInterval(0); + connect(m_allInitializedEmitter, &QTimer::timeout, this, [this](){ + if (m_initializingBackends == 0) + emit allInitialized(); + }); + if(load) QMetaObject::invokeMethod(this, "registerAllBackends", Qt::QueuedConnection); @@ -124,10 +132,7 @@ // to send out the initialized signal. To ensure this happens, schedule it for the // start of the next run of the event loop. if(m_initializingBackends==0) { - QTimer::singleShot(0, this, [this](){ - if (m_initializingBackends == 0) - emit allInitialized(); - }); + m_allInitializedEmitter->start(); } else { slotFetching(); } @@ -155,7 +160,7 @@ } else { m_initializingBackends--; if(m_initializingBackends==0) - emit allInitialized(); + m_allInitializedEmitter->start(); else slotFetching(); } @@ -216,7 +221,7 @@ const auto backends = f.allBackends(); if(m_initializingBackends==0 && backends.isEmpty()) { qCWarning(LIBDISCOVER_LOG) << "Couldn't find any backends"; - emit allInitialized(); + m_allInitializedEmitter->start(); } else { foreach(AbstractResourcesBackend* b, backends) { addResourcesBackend(b);