Потеря данных в сигнал/слот
Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на 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 хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Ora Iro
- Жел. 24, 2024, 6:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
вопрос решен