gpt4 book ai didi

c++ - 如何在非 gui 线程上正确创建 QUdpSocket? Readyread 未发出

转载 作者:行者123 更新时间:2023-11-28 05:12:38 24 4
gpt4 key购买 nike

我正在编写一个包装 QUdpSocket 的网络库:

QAbstractSocket *UdpNetworkStreamer::addConnection()
{
QUdpSocket *udpSocket = new QUdpSocket(this);
udpSocket->bind(connection.port, QUdpSocket::ShareAddress);
bool ret = udpSocket->joinMulticastGroup(QHostAddress(connection.ip));
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead()), Qt::QueuedConnection);

return udpSocket;
}
  1. 创建一个新的QUdpSocket
  2. 连接到它的 readyRead 信号。
  3. 在引发 readyRead 时调用 readDatagram

当我从 Qt GUI 应用程序使用该库时,一切正常。

当另一个用户包含在 Qt GUI 应用程序之外使用的库时,问题就开始了。

他调用addConnection(创建套接字并在readyRead 上调用connect)

调用 addConnection 的线程是非 Qt。

addConnection 似乎成功结束,但从未发出 readyRead

调用 read(即使没有发出 readyRead)会导致成功读取数据报。

无效的修复:

  1. 将 UDP 套接字线程移动到 this->thread

    QUdpSocket *udpSocket = new QUdpSocket();
    udpSocket->moveToThread(this->thread());
    udpSocket->setParent(this);
  2. 我尝试通过调用:void 来模拟问题

    MainWindow::on__btnOpenMulticastReceiver_clicked()
    {
    QFuture<void> future = QtConcurrent::run(this,
    &MainWindow::CreateMulticastConnection, testHandle);
    }

    这也导致了与用户在我的库中遇到的相同的症状,这意味着 readyRead 没有发出。

  3. QSignalSpy - 我在 readyRead 信号上激活了一个 spy ;尽管我可以直接从套接字读取数据,但计数器一直为零。当使用套接字在主线程上初始化时, spy 给出了有效结果(即进展)。

我的问题:

  1. 我错过了什么和做错了什么?
  2. 发出 readyRead 的最简单方法是什么,即使它不是在主 GUI 线程上创建的 - 我找不到任何在没有 GUI 或外部 Qt 线程的情况下工作的示例。

最佳答案

我最终以这种方式解决了这个问题:

void MainWindow::OpenConnection()
{
QThread *t = new QThread();
t->start();

SocketWrapper *w= new SocketWrapper();

w->moveToThread(t);

w->metaObject()->invokeMethod(w, "CreateSocket", Qt::QueuedConnection);
}

您必须在创建套接字时使用套接字包装器被 movedTo() 的线程调用 invokeMethod(),这样创建套接字的线程将有一个运行事件循环。

除此之外,CreateSocket() 需要成为 SocketWrapper 中的一个槽,类似这样:

class SocketWrapper : public QObject
{
Q_OBJECT
public:
explicit SocketWrapper(QObject *parent = 0);


signals:

public slots:
void readyRead();
void CreateSocket();
private:
QUdpSocket *_socket;
};

关于c++ - 如何在非 gui 线程上正确创建 QUdpSocket? Readyread 未发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224223/

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