任何人都可以告诉我,如果我这样做的话吗?
使用Qt我通过继承QTcpServer类来实现TCP服务器。在传入连接上,我创建一个新线程,一个新的Worker对象,然后将对象移动到新线程并启动线程。从这里开始,服务器一直在监听新客户端,然后每个线程都在其对象Worker的运行方法中。
现在,我创建了一个计时器,因为我需要基于1秒的时间间隔和播放歌曲时向每个客户端发送更新。在readyRead插槽中,我使用readAll读取数据,然后执行一些工作并发送回复。
然而,当我回到我的run方法时,我需要继续向客户端发送歌曲数据更新(没有来自客户端的响应)。如果这一切都进入一个while(true)循环然后我检查一些布尔值来启动和停止计时器?我需要发送的曲目信息是歌曲进行时间。
我想我的问题是,我应该这样做吗?这看起来有点复杂,但那又是你的并发性。基本上我需要TCP服务器在某些条件为真时重复向客户端发送数据。我觉得只是一个无休止的循环,检查何时开始和停止计时器是无用的工作。
发布代码会更清楚吗?
答案 0 :(得分:1)
这个问题很古老,但也许它仍然有用。
关于Qt中的主题:
许多人考虑在Qt中进行并行处理,就像在.NET中,你需要为每个操作另一个线程,在qt中这不是必需的!
在qt中你只需要一个线程,如果你有阻塞代码,如计算大事或等待同步来获取SQLServer的答案
如果我理解正确,你就不会有这样的阻止操作 所以我编写了一个非常小的TcpServer而没有继承,没有单个线程(当然除了主事件循环线程),希望能解决你的问题并帮助其他人:
#include <QObject>
#include <QSet>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
class TcpServer : public QObject
{
Q_OBJECT
public:
TcpServer()
{
// handle new connections
this->connect(&this->serverTcp, &QTcpServer::newConnection, this, &TcpServer::handleClientConnect);
// init client refresh timer
this->timer.setInterval(1000);
this->connect(&this->timer, &QTimer::timeout, this, &TcpServer::handleClientUpdates);
this->timer.start();
}
bool startListen(qint16 port)
{
return this->serverTcp.listen(QHostAddress::Any, port);
}
private slots:
void handleClientConnect()
{
QTcpSocket* socketClient = *this->setConnectedClients.insert(this->serverTcp.nextPendingConnection());
this->connect(socketClient, &QTcpSocket::disconnected, this, &TcpServer::handleClientDisconnect);
this->connect(socketClient, &QTcpSocket::readyRead, this, &TcpServer::handleClientData);
}
void handleClientDisconnect()
{
this->setConnectedClients.remove((QTcpSocket*)this->sender());
}
void handleClientData()
{
QTcpSocket* socketSender = (QTcpSocket*)this->sender();
// handle here the data sent by the client
}
void handleClientUpdates()
{
// construct here your update data
QByteArray baUpdateResponse = "test";
// send update data to all connected clients
foreach(QTcpSocket* socketClient, this->setConnectedClients) {
socketClient->write(baUpdateResponse);
}
}
private:
QTcpServer serverTcp;
QTimer timer;
QSet<QTcpSocket*> setConnectedClients;
};