QTCPSocket同时定时器启动

QTCPSocket start by timer at the same time

本文关键字:启动 定时器 QTCPSocket      更新时间:2023-10-16

我在应用程序中有同步(同时启动QTCPSocket)问题,我有10个套接字。我必须在相同的时间读取所有套接字的数据。此时此刻,我有一些东西:

///...///
if(!socket->waitForConnected(-1))
{
    qDebug() << "Server not found";
    emit serverNotFound();
}else if(socket->state()==QAbstractSocket::ConnectedState){
        qDebug() << "Connected"
        connect(timer, SIGNAL(timeout()),this,SLOT(connected())); 
        timer->start(1000);                                                    
    }
}

接通信号:

void SocketsClass::connected()
{
    sendRequest(socket, messageToServer);
}

问题是,当第一个套接字连接时,计时器开始为一个。

你可以改变你的方法。不要等待套接字连接。相反,检查插座是否连接在定时器激活的槽位上。在该槽中,您可以遍历所有套接字,并向每个套接字发送消息。

最后,你不应该使用Qt的waitForXxx方法,它们会导致一个可怕的伪同步代码,非常容易出错,难以扩展和维护。请使用信号槽机制。

的例子:

SocketManager : public QObject {
  Q_OBJECT
  QTcpSocket m_sockets[10];
  QTimer m_timer;
public:
  SocketManager(QObject * parent = 0) : QObject(parent) {
    ... // connect all sockets here
    m_timer.start(1000);
    connect(&m_timer, &QTimer::timeout, [this]{
      for (auto & socket : m_sockets)
        if (socket.state() == QAbstractSocket::ConnectedState)
          sendRequest(socket, messageToServer);
    });
  }
};