Алексей Внуков
1 мая 2021 г. 0: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 г. 16:58
  • Ответ был помечен как решение.

вопрос решен

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    • Последние комментарии
    • IscanderChe
      12 апреля 2025 г. 17:12
      Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
    • AK
      1 апреля 2025 г. 11:41
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      9 марта 2025 г. 21:02
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      9 марта 2025 г. 16:14
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      22 ноября 2024 г. 21:51
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…