我正在编写一个包含以下内容的网络库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;
}
- 创建一个新的
QUdpSocket
. - 连接到它的
readyRead
信号。 readDatagram
提出时调用readyRead
。
当我使用 Qt GUI 应用程序中的库时,一切正常。
当另一个用户包含在 Qt GUI 应用程序之外使用的库时,问题就开始了。
他调用addConnection
(创建套接字并调用 connect readyRead
)
调用的线程addConnection
是非 Qt。
addConnection
似乎成功结束,但从未readyRead
发出。
调用 read(即使没有readyRead
发出)会导致成功的数据报读取。
无效的修复:
将 UDP 套接字线程移动到 this->thread
QUdpSocket *udpSocket = new QUdpSocket(); udpSocket->moveToThread(this->thread()); udpSocket->setParent(this);
我试图通过调用来模拟问题:void
MainWindow::on__btnOpenMulticastReceiver_clicked() { QFuture<void> future = QtConcurrent::run(this, &MainWindow::CreateMulticastConnection, testHandle); }
这也导致了与用户对我的库的相同症状,这意味着
readyRead
没有发出。QSignalSpy
- 我已经激活了对readyRead
信号的间谍;尽管我可以直接从套接字读取数据,但计数器一直为零。当使用套接字在主线程上初始化时,间谍给出了有效的结果(即进展)。
我的问题:
- 我错过了什么,做错了什么?
- 即使不是在主 GUI 线程上创建发出的最简单的方法是什么
readyRead
- 我找不到任何在没有 GUI 或外部 Qt 线程的情况下工作的示例。