Потеря данных в сигнал/слот
Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на Qt для других приложений. В билиотеке после инициализации есть основной поток (который является менеджером управления), пользователь при необходимости создает клиент для работы с сервером (каждый клиент работает со своим сервером), который помещается в отдельный поток и начинает работу с сервером по TCP. Обращение к серверу происходит каждые 300 мс.Когда на сервере есть данные он их возвращает в виде строки, которую я возвращаю из библиотеки, и пользователь уже сам парсит. Переодически библиотека падает и ложит приложение которое с ней работает. По логам удалось выяснить что иногда теряются данные которые должны вернуться из вызывающей ф-ии, в результате чего происходит обращение к несуществующим данным и как следствие падение.
Ф-ия для вызова из библиотеки:
- extern "C" CONFIG_CORESHARED_EXPORT char* Get_log(int idx) // Q_DECL_EXPORT
- {
- classPoint->sig_com_get_log(idx);//idx - индекс клиента в библиотеке, classPoint - указатель на класс управления который создается в основном потоке
- int count=0,indx=idx;
- QEventLoop loop;
- QByteArray answer;
- answer.clear();
- answer.resize(0);
- QMetaObject::Connection conn = QObject::connect(classPoint, &Config_core::sig_done_get_log,[&loop,indx,&answer,&count](int i, QByteArray arr){//потеря данных происходит в этой лямде
- if(i==indx)
- {
- count++;
- try {
- if(arr.toInt()==-5)
- {
- if(count<=5)
- {
- classPoint->sig_com_get_log(indx);
- }
- else
- {
- loop.exit();
- answer.append(QString("-2"));
- }
- }
- else
- {
- loop.exit();
- answer.append(arr);
- }
- }
- catch (...)
- {
- loop.exit();
- answer.append("-1");
- std::cout<<"Get_log in catch";
- }
- }
- });
- QTimer t;
- QMetaObject::Connection conn2=QObject::connect(&t, &QTimer::timeout,[&loop,&answer](){
- loop.exit();
- answer.append(QString("-1"));
- });
- t.start(5000);
- loop.exec();
- t.stop();
- QObject::disconnect(conn);
- QObject::disconnect(conn2);
- return answer.data();
- }
в classPoint происходит проброс сигнала от сервера на вывод из библиотеки:
- connect(control,&Client::sig_done_get_log,this,&Manager::sig_done_get_log);
в потоке клиента получаю данные от сервера и отправляю на вывод:
- answer_tcp_get_log.clear();//QByteArray answer_tcp_get_log - создается вместе с инициализацией обьекта класса Client
- answer_tcp_get_log.resize(0);
- QJsonValue result = json_doc.object().value(QLatin1String("result"));
- answer_tcp_get_log.append(QString("%1").arg(result.toString()));
- emit sig_done_get_log(client_id, answer_tcp_get_log);
связи в периодичности падения замечено небыло, может несколько раз в день упасть, а может и раз в неделю. проверка масива на isNull() результата не дали
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
вопрос решен