Потеря данных в сигнал/слот
Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на 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() результата не дали
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
вопрос решен