Асинхронная инициализация объекта с использованием QtConcurrent - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть асинхронный сборщик объектов.

  1. Fetcher во время инициализации загружает базовые идентификаторы объектов для извлечения и готов к работе после завершения.Этот init должен быть асинхронным.
  2. После того, как пользователь init может вызвать fetchMore(int count), который начинает загрузку асинхронных объектов.
  3. 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 и сигнальным соединением, как я могу убедиться, что я не потерял сигнал инициализации?

...