У меня есть асинхронный сборщик объектов.
Fetcher
во время инициализации загружает базовые идентификаторы объектов для извлечения и готов к работе после завершения.Этот init должен быть асинхронным. - После того, как пользователь init может вызвать
fetchMore(int count)
, который начинает загрузку асинхронных объектов. Fetcher
имеет два сигнала initFinished
и fetchFinished`
Я хочу начать инициализацию в конструкторе Fetcher
.Могу ли я быть уверен, что сигнал initFinished
НЕ будет издан до того, как я подключу этот сигнал к FetcherUser
?
class Fetcher : public QObject {
private:
QFutureWatcher<QList<ObjectId> > watcherInit;
QFutureWatcher<QList<Object> > watcherFetch;
QList<ObjectId> listIds;
QList<ObjectId> asyncInit() {
// Do some ids load
}
QList<Object> asyncFetchMore(QList<ObjectId> ids) {
// Do some objects load
}
signals:
void initFinished();
void fetchFinished(const QList<Object> &list);
public:
explicit Fetcher()
{
connect(&watcherInit, &QFutureWatcher<QList<ObjectId>>::finished, [this]{
// take ids and change init flag
emit initFinished();
});
auto future = QtConcurrent::run(&Fetcher::asyncInit, this);
watcherInit.setFuture(future)
}
void fetchMore(int count) {
// take some ids from list and QtConcurrnt run asyncFetchMore
}
};
//================================================
class FetcherUser : public QObject
{
Fetcher *fetcher = nullptr;
private:
void initFinished() {
//Start interaction with fetcher
}
public:
FetcherUser() {
fetcher = new Fetcher(); // Here async init started
connect(fetcher, &Fetcher::initFinished, this, &FetcherUser::initFinished); //and here connect signal
}
};
Так могу ли я быть уверен, что после завершения конструктора и запуска асинхронной инициализации, и до того, как сигналподключен к FetcherUser
, сигнал Fetcher
не будет излучаться?Более того, если я добавлю некоторые операции между конструктором Fetcher
и сигнальным соединением, как я могу убедиться, что я не потерял сигнал инициализации?