Алексей Внуков
Мамыр 1, 2021, 12:42 Т.Ж.

Потеря данных в сигнал/слот

Qt, c++, dll

Доброго времени суток, я как вседа с интересными задачками)
Пишу свою библиотеку на Qt для других приложений. В билиотеке после инициализации есть основной поток (который является менеджером управления), пользователь при необходимости создает клиент для работы с сервером (каждый клиент работает со своим сервером), который помещается в отдельный поток и начинает работу с сервером по TCP. Обращение к серверу происходит каждые 300 мс.Когда на сервере есть данные он их возвращает в виде строки, которую я возвращаю из библиотеки, и пользователь уже сам парсит. Переодически библиотека падает и ложит приложение которое с ней работает. По логам удалось выяснить что иногда теряются данные которые должны вернуться из вызывающей ф-ии, в результате чего происходит обращение к несуществующим данным и как следствие падение.

Ф-ия для вызова из библиотеки:

  1. extern "C" CONFIG_CORESHARED_EXPORT char* Get_log(int idx) // Q_DECL_EXPORT
  2. {
  3. classPoint->sig_com_get_log(idx);//idx - индекс клиента в библиотеке, classPoint - указатель на класс управления который создается в основном потоке
  4. int count=0,indx=idx;
  5. QEventLoop loop;
  6. QByteArray answer;
  7. answer.clear();
  8. answer.resize(0);
  9. QMetaObject::Connection conn = QObject::connect(classPoint, &Config_core::sig_done_get_log,[&loop,indx,&answer,&count](int i, QByteArray arr){//потеря данных происходит в этой лямде
  10. if(i==indx)
  11. {
  12. count++;
  13. try {
  14.  
  15. if(arr.toInt()==-5)
  16. {
  17. if(count<=5)
  18. {
  19. classPoint->sig_com_get_log(indx);
  20. }
  21. else
  22. {
  23. loop.exit();
  24. answer.append(QString("-2"));
  25. }
  26. }
  27. else
  28. {
  29. loop.exit();
  30. answer.append(arr);
  31. }
  32. }
  33. catch (...)
  34. {
  35. loop.exit();
  36. answer.append("-1");
  37. std::cout<<"Get_log in catch";
  38. }
  39. }
  40. });
  41. QTimer t;
  42. QMetaObject::Connection conn2=QObject::connect(&t, &QTimer::timeout,[&loop,&answer](){
  43. loop.exit();
  44. answer.append(QString("-1"));
  45. });
  46. t.start(5000);
  47. loop.exec();
  48. t.stop();
  49. QObject::disconnect(conn);
  50. QObject::disconnect(conn2);
  51. return answer.data();
  52.  
  53. }

в classPoint происходит проброс сигнала от сервера на вывод из библиотеки:

  1. connect(control,&Client::sig_done_get_log,this,&Manager::sig_done_get_log);

в потоке клиента получаю данные от сервера и отправляю на вывод:

  1. answer_tcp_get_log.clear();//QByteArray answer_tcp_get_log - создается вместе с инициализацией обьекта класса Client
  2. answer_tcp_get_log.resize(0);
  3. QJsonValue result = json_doc.object().value(QLatin1String("result"));
  4. answer_tcp_get_log.append(QString("%1").arg(result.toString()));
  5. emit sig_done_get_log(client_id, answer_tcp_get_log);

связи в периодичности падения замечено небыло, может несколько раз в день упасть, а может и раз в неделю. проверка масива на isNull() результата не дали

1

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

1
Алексей Внуков
  • Мамыр 5, 2021, 4:58 Т.Қ.
  • Жауап шешім ретінде белгіленді.

вопрос решен

    Пікірлер

    Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
    Кіріңіз немесе Тіркеліңіз