我编写了一个小程序,它嗅探设备控制软件与其硬件的串行通信,并提取测量值以发送给我的应用程序,该应用程序控制该测试系统的其他功能。对于这个嗅探器和我的应用程序之间的通信,我使用QLocalServer,它应该通过命名管道与我的应用程序进行通信。我经历过沟通非常缓慢,我想知道为什么。使用sysinternals中的process,我发现这个QLocalServer创建了50个同名命名管道。
这里是服务器的定义:
server = new QLocalServer(this);
server->setMaxPendingConnections(1);
connect(server, &QLocalServer::newConnection, this, &SSRTSniffer::connectionEstablished);这里是侦听模式下的初始化:
void SSRTSniffer::initServer(){
qDebug() << "Init Server";
if(serverName.isEmpty())
return;
if(server->isListening())
{
if(clientConnected)
{
client->disconnectFromServer();
do
{
QEventLoop loop;
QTimer::singleShot(50, &loop, SLOT(quit()));
loop.exec();
} while (clientConnected);
}
}
server->close();
if(!server->listen(serverName))
{
qDebug() << "Could not start server";
}}以及在建立通信时执行的代码:
void SSRTSniffer::connectionEstablished(){
qDebug() << "Connected";
clientConnected = true;
client = server->nextPendingConnection();
connect(client, &QLocalSocket::disconnected, client, &QLocalSocket::deleteLater);
connect(client, &QLocalSocket::disconnected, this, &SSRTSniffer::connectionClosed);}发布于 2022-08-24 16:43:59
完全不是专家,但看起来问题可能来自异步调用singleshot()的but ()。它强制直接退出(0),如果有打开的文件、管道或其他任何东西或malloc()-ed,那么如果没有适当的清理、关闭、空闲(),所有这些都仍然存在。由于这发生在一个并发循环中,我希望每隔50 As就会有一个新管道(单参数,第一个参数)。如果你只有50个管道,你要么负责2,5s,要么你的操作系统做一些内部限制这个数字的事情。
https://stackoverflow.com/questions/73476593
复制相似问题