13 ноября 2019 г. 0:32

Коллизия QEventLoop

Привет, может кто сталкивался с коллизией QEventLoop ( одна ивентлуп мешает другой) , подскажите куда копать?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
2

Привет. Можно попродробнее? Вы создаёте два QEventLoop в логике своей программы? Используете мьютексы? или что?

Обычно dead lock`и исправляются только переписыванием логики программы. Но каждый случай индивидуален.

  • 13 ноября 2019 г. 8:33
  • (ред.)

Приложение трэкинг задач. Есть вложения. Добавляем вложение и отправляем его на сервер. Для синхронного вызова методов в синхронизации, используем QEventLoop при отправке вложений. В момент синхронизации при попытке входа в задачу, показывается курсор ожидания (ожидания завершения синхронизации), для которого также используется QEventLoop . В итоге получается конфликт и QEventLoop в реализации курсора перекрывает, другой. Синхронизация не заканчивается.

// MyModelVm.cpp
void MyModelVm::transitionStart(int modelEntityNumber) {
    Navigator::instance().showWaitCursor("...Cинхронизация данных");
    m_currentEntity = modelEntityNumber;

    QEventLoop loop;
    AutoDisconnect(
        connect(&myModelManager::instance(), &myModelManager::activeSyncChanged, [this, &loop] {

            if ( !isActiveSync() && !isChangedLocal() ) {
                loop.quit();
                emit isActiveSyncChanged();
            }
        });
    )
    loop.exec();
}

// myModelManager.cpp
void myModelManager::sendObjects() {
    qDebug() << "<=> sending objects";

    QList<QSharedPointer<LocalModel>> addedLocalModel = myModelManager::instance().getLocalAddedModel();
    qDebug() << "Number of objects added" << addedLocalModel.size();

    int sendObjectsCount = 0;
    int modelCount = addedLocalModel.size();
    if (sendObjectsCount) {
        QEventLoop loop;
        for (auto& localModel : addedLocalModel) {
            auto filesReply = myModelManager::instance().postFiles(ObjectHelper::filePath(localModel->fileName, localModel->fileId));
            myModelManager::instance().replyReady(filesReply,
                                                    [this, localModel, modelCount, &sendObjectsCount, &loop]
                                                    (const BaseResult& filesResult)
            {
                if (filesResult.code() == ServiceCodeResult::OK) {
                    qDebug() << "Model" << localModel->fileName << "recieved to file-server";
                    QSharedPointer<FilesJson> jsonDataFiles = FilesJson::fromJson(filesResult.jsonDocument());
                    QString fId = jsonDataFiles->id;
                    QString fName = jsonDataFiles->fileName;
                    QString xId = StringHelper::createUuid();
                    auto postChangesModelReply = myModelManager::instance().postChangesAddModel(fName, fName, fId, xId);
                    myModelManager::instance().replyReady(postChangesModelReply,
                                                            [this, localModel, externalId, fileId, modelCount, &sendObjectsCount, &loop]
                                                            (const BaseResult& changesResult)
                    {
                        if (changesResult.code() == ServiceCodeResult::OK) {
                            qDebug() << "Attachment" << localModel->fileName << "recieved to MT Attachment";
                            m_mutex.lock(); //QMutex
                            ++sendAttachmentCount;
                            localModel->externalId = externalId;
                            localModel->fileId = fileId;
                            localModel->changeType = ChangeType::None;
                            myModelManager::instance().updateLocalModel(localModel);

                            if (sendObjectsCount == modeltCount) {
                                qDebug() << "=== sendAttachmentChanges Ok";
                                m_mutex.unlock();
                                loop.quit();
                                return;
                            }
                            m_mutex.unlock();
                        } else {
                            qDebug() << "Ошибка отправки файла: " + localModel->fName + " : " + changesResult.message() + " (postChangesModel)";
                            Logger::instance().write("Ошибка отправки файла: " + localModel->fName + " : " + changesResult.message(), Logger::ERROR);
                            qDebug() << "=== sendObjects Fail";
                            loop.quit();
                            return;
                        }
                    });
                } else {
                    qDebug() << "Ошибка отправки файла: " + localModel->fName + " : " + filesResult.message() + " (postFiles)";
                    Logger::instance().write("Ошибка отправки файла: " + localModel->fName + " : " + filesResult.message(), Logger::ERROR);
                    qDebug() << "=== sendObjects Fail";
                    loop.quit();
                    return;
                }
            });
        }
        loop.exec();
    }
}

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

ГС
23 января 2020 г. 15:04
Галина Степанівна Шепелюк

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:10баллов,
  • Очки рейтинга-10
ГС
23 января 2020 г. 14:51
Галина Степанівна Шепелюк

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
M
23 января 2020 г. 3:28
Mitrider

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
21 января 2020 г. 13:12
Docent

Полезная статья. Как всегда - то что надо. Добавлю ещё маленькую полезность - после установки tracer (88 строка) и перед выводом значений в lineEdit (91 строка) стоит добавить updatePositio…
17 января 2020 г. 1:31
Андрей Янкович

Выглядит как ошибка библиотеки. Расскажите подробно на какой платформе вы собираете проект (MinGW или MSVC) их версии и версии Qt.
D
16 января 2020 г. 11:06
DENIZ1819

Доброго времени суток, не подскажите, что делать в данной ситуации, после того, как я сделал все вышеуказанные инструкции для подключения библиотеки к проекту?
14 января 2020 г. 4:33
Евгений Легоцкой

Рекомендую Wt, достаточно мощная вещь. Этот фреймворк может использоваться для написания сайтов на C++, либо можно использовать только отдельный компоненты, например только ORM. Но я не знаю, ка…
a
14 января 2020 г. 4:29
ayb

Спасибо за инфу. Поиск качественной ORM привел меня только к sqlite_orm, но не подходит из-за необходимости полноценной поддержки c++14. Про framework Wt не слышал, спасибо за наводку.
Сейчас обсуждают на форуме
24 января 2020 г. 1:37
Евгений Легоцкой

Не уверен. я бы попробовал выдернуть ссылки и забрать всё через QNetworkAccessManager, если вам не нужно запускать эти скрипты. Я с той ошибкой не сталкивался.
VZ
23 января 2020 г. 12:29
Vladimir Zhitkovsky

Доброго дня! Вопрос как правильно удалять данные из модели сделанной таким образом: https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html пример с QObjectList-based Model. В плю…
23 января 2020 г. 11:54
Intruder

Евгений, с удалением строк разобрался. Спасибо за помощь. Немного пришлось модернизировать код, но все получилось вроде.
22 января 2020 г. 5:06
Pavel.K

Можете попробовать через Loader сделать, те cделать свой компонент ректангл с нужными вам полями и через Loader вызывать этот компонент , а через Connections прописать что ваш компонент отрисова…
22 января 2020 г. 3:25
Pavel.K

Привет, кто-нибудь делал тестовый Json сервер , чтобы не просто через сокет ByteArray пересылать, а с клиента обрабатывать Post и get запросы? Буду очень признателен если у кого то есть пр…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB