Дмитрий
9 ноября 2021 г. 19:46

Сигнал QTcpSocket::readyRead()

signals, QTcpSocket

Всем привет.
Есть класс, в котором есть объект класса, работающий с QTcpSocket. Этот класс создается в main():

  1. int main(int argc, char *argv[])
  2. {
  3. QCoreApplication a(argc, argv);
  4. MController mc;
  5. mc.set_ip(ip);
  6. mc.set_password(password);
  7. mc.set_data_for_send(packet);
  8. mc.start();
  9. return a.exec();
  10. }

В методе start() создается объект для работы с сокетом, осуществляется соединение и при успешном коннекте в сокет отправляются нужные данные.
Но сигнал QTcpSocket::readyRead() не емитится и привязанный к нему слот не вызывается.
Посмотрел в Wireshark - данные уходят и приходит ответ.
Сам метод start() (выкинул то, что не имеет отношения к делу):

  1. void MController::start()
  2. {
  3. constexpr uint16_t port = 2222;
  4. device_connector = std::make_unique<TCP_Connector>(ip_, port);
  5.  
  6. device_connector->connect_to_device();
  7. dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read();
  8. }
  9.  

В конец метода вставил

  1. dynamic_cast<TCP_Connector*>(device_connector.get())->wait_ready_read();

в нем происходит:

  1. tcp_->waitForReadyRead(4000);

После этого сигнал срабатывает один раз. по приему данных отправляю следующие данные, и ответа опять нет.
Думаю, что что-то связано с циклом обработки событий, но не пойму как сделать так, чтобы соединение создавалось после запуска этого цикла обработки событий.
Причем есть подобный код, но с графикой - там проблем нет. Но там коннект по кнопке осуществляется.
Как заставить работать нормально сигналы и слоты? Что-то затупил малость.

2

Вам это нравится? Поделитесь в социальных сетях!

3
Дмитрий
  • 9 ноября 2021 г. 19:47

Да - пробовал еще QTimer создать, но он тоже не срабатывает.

    Docent
    • 9 ноября 2021 г. 20:24

    "После этого сигнал срабатывает один раз" - один раз и должен был сработать до вызова обработчика событий;
    "readyRead() не емитится и привязанный к нему слот не вызывается" - этого и не видно в представленном коде;

      Дмитрий
      • 9 ноября 2021 г. 20:34

      "этого и не видно в представленном коде;" - это внутренности MController. Во внутренностях этот коннект есть

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь