我有一些设备连接到同一网络。他们都运行TCP服务器。我的PC也连接到同一个网络。我需要从其他设备收集数据。所以我即将在Qt框架中编写一个应用程序来做到这一点。我将与设备交换小包,所以我认为我为具有QTcpSocket成员的设备制作通用对象,并且我使用信号和插槽来接收数据。我有一个其他类用于连接设备。它继承了QObject和QRunnable。 QRunnables的run方法实现了连接过程,如下所示:
QTcpSocket socket;
socket.connectToHost(this->hostAddress, this->portNumber);
if(socket.waitForConnected())
{
emit Connected(this->deviceId, socket.socketDescriptor());
}
else
{
emit Error(this->deviceId);
}
此函数使用QThreadPool在单独的线程中运行,以避免因连接时间而导致的长时间延迟:
Connector* connector = new Connector(hostAddress, port, id);
connect(connector, &Connector::Connected, this, &CommunicationLayer::Connected);
connect(connector, &Connector::Error, this, &CommunicationLayer::Error);
QThreadPool::globalInstance()->start(connector);
当触发Connected信号时,我为该特定id实例化一个设备对象:
this->devices.push_back(new Device(id, socketDescriptor, this));
connect(this->devices.back(), &Device::DataReceived, this, &CommunicationLayer::DataReceived);
套接字的描述符作为参数传递,然后当实例化Device对象时,我用该参数在设备对象内的套接字上调用QTcpSocket :: setSocketDescriptor。
我的问题是有时我收到了奇怪的消息: QSocketNotifier:套接字7无效并键入' Read',禁用... QSocketNotifier:套接字7无效,键入'写',禁用......
有时候我什么也得不到它只是有效,有时我会得到两者,有时只是其中之一。我有点无能为力。
修改
我认为我发现了一个问题:因为我在运行函数中将套接字声明为自动变量,它在函数返回时超出范围,因此套接字描述符无效。并且因为它在一个单独的线程中运行,有时我的设备是在函数返回之前构造的,这样套接字描述符仍然有效。我在运行函数中使用套接字对象作为指针,它现在可以正常工作,但我不知道它是否会导致内存泄漏。有任何想法吗? (如果我使用智能指针来管理套接字的生命周期,我会得到与之前相同的自动变量结果)