Потеря данных в сигнал/слот
Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на 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 хостинг.Вам це подобається? Поділіться в соціальних мережах!
- molni99
- 26 жовтня 2024 р. 08:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 08:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
вопрос решен