
Потеря данных в сигнал/слот
Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на 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() результата не дали

Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Unknown akadamn
- 24 января 2025 г. 17:14
Qt - Тест 001. Сигналы и слоты
- Результат:84баллов,
- Очки рейтинга4
- Unknown akadamn
- 24 января 2025 г. 16:22
Qt - Тест 001. Сигналы и слоты
- Результат:42баллов,
- Очки рейтинга-8


вопрос решен