我在我有 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/