Pavel.K13 ноября 2019 г. 1:32

Коллизия QEventLoop

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

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

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

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

  • 13 ноября 2019 г. 9: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();
    }
}

Комментарии

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

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
КА

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

  • Результат:78баллов,
  • Очки рейтинга2
R

C++ - Тест 002. Константы

  • Результат:75баллов,
  • Очки рейтинга2
R

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
V

Django - Урок 027. Добавление Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Сейчас обсуждают на форуме

Как в Qt сохранить файл в папку загрузок в Android

Вызывайте эту функцию или в самом начале, или когда нужно сохранять файлы. Она дает права доступа для записи.

QML+QtGraphicalEffects

да, сборку делал без параметра поиска qml, хотя dll QtGraphicalEffects он подтягивает, когда я добавил всю папку QtGraphicalEffects в проект - то заработало, похоже что именно qml-файлов ему не …

Не работают слоты/сигналы

и посмотрите работу с потоками в Qt, там подробно описано как передавать данные с одного в потока в другой при помощи сигналов и слотов

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB