#include "udpsocketworker.h" #include "common.h" UdpSocketWorker::UdpSocketWorker(const QHostAddress hostAddr, const int port, QObject *parent) : QObject(parent) , m_udpSocket(new QUdpSocket(this)) { m_udpSocket->bind(hostAddr, port); connect(m_udpSocket, &QUdpSocket::readyRead, this, &UdpSocketWorker::processPendingDatagrams); } UdpSocketWorker::~UdpSocketWorker() { m_udpSocket->close(); qDeleteAll(m_timers); // 清理所有动态创建的定时器 } void UdpSocketWorker::sendData(const QByteArray &data, const QHostAddress &address, quint16 port) { m_udpSocket->writeDatagram(data, address, port); } void UdpSocketWorker::processPendingDatagrams() { while (m_udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(static_cast(m_udpSocket->pendingDatagramSize())); m_udpSocket->readDatagram(datagram.data(), datagram.size()); emit dataReceived(datagram); } } void UdpSocketWorker::startSending(const QString &id, const QByteArray &data, const QHostAddress &address, const quint16 port, int interval) { if (m_timers.contains(id)) { stopSending(id); // 如果存在相同ID的定时器,先停止 } QTimer *timer = new QTimer(this); // 创建新的定时器 m_timers[id] = timer; m_dataToSend[id] = data; m_targetAddress[id] = address; connect(timer, &QTimer::timeout, this, [=]() { sendData(m_dataToSend[id], m_targetAddress[id], port); }); timer->start(interval); } void UdpSocketWorker::stopSending(const QString &id) { if (m_timers.contains(id)) { QTimer *timer = m_timers.take(id); timer->stop(); timer->deleteLater(); // 删除定时器对象 m_dataToSend.remove(id); m_targetAddress.remove(id); } }