gpt4 book ai didi

c++ - QTcpSocket:消息不是从另一个线程发送的

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:42 24 4
gpt4 key购买 nike

我知道这个主题已经有很多主题,但没有人来解决我的问题......我希望有人能找到解决方案。

主题:我正在开发一个多线程游戏服务器。然后,我重载 TcpServer 来写我的等等......

void TcpServerCustomersHandler::incomingConnection(qintptr socketDescriptor)
{
ThreadCustomer* client = new ThreadCustomer(socketDescriptor);
connect(client, &ThreadCustomer::finished, client, &ThreadCustomer::deleteLater);
client->start();
}

我已经编写了另一个重载 QThread 的类并编写了我的连接。在“问答”模式下,它有效。我收到消息并回复。

void ThreadCustomer::run()
{
qDebug() << "Starting thread: " << m_socketDescriptor;
m_tcpSocket = new QTcpSocket();

if(!m_tcpSocket->setSocketDescriptor(m_socketDescriptor))
{
qCritical() << "Error creation thread:" << m_tcpSocket->errorString();
return;
}

connect(m_tcpSocket, &QTcpSocket::readyRead, this, &ThreadCustomer::onReadyRead_TcpSocket, Qt::DirectConnection);
connect(m_tcpSocket, &QTcpSocket::disconnected, this, &ThreadCustomer::onDisconnected_TcpSocket, Qt::DirectConnection);
connect(InstanceManager::instance(), &InstanceManager::readyRead, this, &ThreadCustomer::onReadyRead_InstanceManager);

exec();
}

void ThreadCustomer::onReadyRead_TcpSocket()
{
QByteArray message = m_tcpSocket->readAll();
//works...
m_tcpSocket->write(message);
}

但是因为它是一个游戏服务器,我希望他能够发送“通知”。这意味着向玩家发送消息之前没有收到任何消息。这些通知由单例“InstanceManager”发送。

void ThreadCustomer::onReadyRead_InstanceManager(QByteArray message)
{
m_tcpSocket->write(message);
}

这是我的问题。当调用“write()”时,没有消息发出,我有一条著名的消息:“QSocketNotifier:无法从另一个线程启用或禁用套接字通知程序”。我知道我收到此消息是因为尽管已连接,但从另一个线程调用了“write()”。

不幸的是,我找不到解决这个问题的方法。有人有想法吗?

最佳答案

好的,感谢@wtom,我找到了第一个基于队列的解决方案。

我在 QThread 中使用 QTimer 来处理消息并避免冲突。对于其他人:

void ThreadCustomer::run()
{
qDebug() << "Starting thread: " << m_socketDescriptor;
m_tcpSocket = new QTcpSocket();

if(!m_tcpSocket->setSocketDescriptor(m_socketDescriptor))
{
qCritical() << "Error creation thread:" << m_tcpSocket->errorString();
return;
}

m_timerWritting = new QTimer();
connect(m_timerWritting, &QTimer::timeout, this, &ThreadClient::onTimeOut_timerWritting, Qt::DirectConnection);
m_timerWritting->start(500);

connect(m_tcpSocket, &QTcpSocket::readyRead, this, &ThreadClient::onReadyRead_TcpSocket, Qt::DirectConnection);
connect(m_tcpSocket, &QTcpSocket::disconnected, this, &ThreadClient::onDisconnected_TcpSocket, Qt::DirectConnection);
connect(InstanceManager::instance(), &InstanceManager::readyRead, this, &ThreadClient::onReadyRead_InstanceManager, Qt::QueuedConnection);

exec();
}

void ThreadCustomer::onReadyRead_InstanceManager(QByteArray message)
{
m_listMessageToSend.append(message);
}
void ThreadCustomer::onTimeOut_timerWritting()
{
if(m_listMessageToSend.count() > 0)
{
QByteArray message = m_listMessageToSend.takeFirst();
m_tcpSocket->write(message);
}
}

我不知道这是否是更好的解决方案,但它确实有效:)

关于c++ - QTcpSocket:消息不是从另一个线程发送的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51323525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com