c++ - QTCPSocket同时由定时器启动

标签 c++ qt timer qtcpsocket

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

///...///
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);
    });
  }
};

关于c++ - QTCPSocket同时由定时器启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31659060/

相关文章:

c++ - C4430 错误 - 缺少类型说明符 - 假定为 int

c# - Mac OS X Lion 上的屏幕捕获程序,最好在其他操作系统上可移植

C++/Qt - 无法从 qrc 文件打开 .txt

qt - 如何找出qml中可用的字体?

c++ - Qt - MainWindow 在运行时卡住

java - ScheduledExecutorService 仅触发一次

c++ - 如何强制调用 move 构造函数,我为什么要这样做?

c++ - VC 2005 错误 "Il mismatch between ' P 1' version ' 2006020 1' and ' P 2' version ' 2005041 1'"

c# - 完成后计时器重新启动功能

javascript - vue js Prop 重置计时器