多线程Qt TCP客户端

时间:2015-09-28 11:40:33

标签: c++ qt sockets tcp

我有一些设备连接到同一网络。他们都运行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无效,键入'写',禁用......

有时候我什么也得不到它只是有效,有时我会得到两者,有时只是其中之一。我有点无能为力。

修改

我认为我发现了一个问题:因为我在运行函数中将套接字声明为自动变量,它在函数返回时超出范围,因此套接字描述符无效。并且因为它在一个单独的线程中运行,有时我的设备是在函数返回之前构造的,这样套接字描述符仍然有效。我在运行函数中使用套接字对象作为指针,它现在可以正常工作,但我不知道它是否会导致内存泄漏。有任何想法吗? (如果我使用智能指针来管理套接字的生命周期,我会得到与之前相同的自动变量结果)

0 个答案:

没有答案