event mechans
和signals -slots
实现的更多细节之后。我担心程序性能和稳定性。
关键问题是服务器使用单个线程来处理多个tcpsockets。实现简介代码:
incomingConnection
函数编写如下:两个QSignalMapper
用于映射每个套接字SlotReadyRead
和SlotDisconnected
void ServerModule::incomingConnection(qintptr socketDescriptor)
{
m_tcpSocket = new QTcpSocket(this);
if (!m_tcpSocket->setSocketDescriptor(socketDescriptor)) {
return;
}
connect(m_tcpSocket, SIGNAL(readyRead()), m_readyReadSignalMapper, SLOT(map()));
m_readyReadSignalMapper->setMapping(m_tcpSocket, m_tcpSocket);
connect(m_tcpSocket, SIGNAL(disconnected()), m_disconnectedSignalMapper, SLOT(map()));
m_disconnectedSignalMapper->setMapping(m_tcpSocket, m_tcpSocket);
}
ServerModule::ServerModule(QObject * parent) : QTcpServer(parent),m_readyReadSignalMapper(new QSignalMapper(this)),m_disconnectedSignalMapper(new QSignalMapper(this))
{
connect(m_readyReadSignalMapper, SIGNAL(mapped(QObject *)), this, SLOT(SlotReadyRead(QObject *)));
connect(m_disconnectedSignalMapper, SIGNAL(mapped(QObject *)), this, SLOT(SlotDisconnected(QObject*)));
......other code
}
SlotReadyRead
和SlotDisconnected
函数都是正常的,它会将QObject* socketObject
转换为QTcpSocket *socket
,然后再做一些工作。所以我已经了解到,如果写一下connect
函数与特定的connect mode
Qt的:: DirectConnection
Qt的:: QueuedConnection
Qt的:: BlockingQueuedConnection
如果使用单线程,则只能使用第一模式和第二模式。并使用第一种模式,它是 同步 ,如果是第二种,它是 异步 。我的程序默认使用第一种模式,因此signals -slots
已连接 同步 。
所以这是我的担心:
1.处理多个套接字的单线程性能如何?它能达到每秒500个连接的并发性吗?可以处理的最大连接数是多少?
2.如果同时有多个套接字准备好读取,然后调用qt core来发送readyRead
信号,QSignalMapper
可以正确处理它吗?
3.我应该使用 QueuedConnection 模式连接socket
和QSignalMapper
,因为此连接未立即连接,而是使用event queue
和postEvent
要联系。所以它的 异步 。在这种情况下,可以处理并发请求吗?
答案 0 :(得分:1)
首先,您的代码存在一些问题:
现在,在您提问的连接部分,您应该简要阅读https://woboq.com/blog/how-qt-signals-slots-work.html:
唯一的"同步"方法是阻塞的,因为它会阻塞,但这并不意味着它是一个问题,你可以有一个非gui线程阻止等待gui线程的回复,同时要求用户密码,例如。
现在的问题:
最常见的方法是在您的广告位上调用sender(),因为小点击的性能(发送者()发出呼叫),使用lambda会更快:
void Parser::readyRead() {
auto socket = qobject_cast<QTcpSocket*>(sender());
...
}
或者使用lambda:
connect(sock, &QTcpSocket::readyRead, [sock] () {
// use sock obj here
});