gpt4 book ai didi

c++ - 无法使用 QtNetwork,因为应用程序使用不同的线程

转载 作者:太空狗 更新时间:2023-10-29 20:55:13 26 4
gpt4 key购买 nike

当我使用 QtNetwork 时,我的应用程序中出现了一个奇怪的行为。我可以很容易地创建 QTcpSeverQTcpSocket 实例,一切都运行良好,但是当涉及到 QTcpSocket::write() 时,会出现以下错误:

错误

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x7f66980022e0), parent's thread is QThread(0x7f66a0020be0), current thread is QThread(0x7f66a0020e20)
QSocketNotifier: Can only be used with threads started with QThread

我觉得奇怪的地方:我不知道这个QThread(0x7f66a0020e20) 是什么/在哪里以及如何影响它(看看下面的调试)

程序

我正在使用网络支持扩展我的主要应用程序(这是一个库)。我把网络服务放到了一个额外的类中。

这里是主要应用程序/库的摘录,我的网络支持是在其中创建的:

QThread *thread = new QThread;
wifi = new WirelessNet(0, thread);
wifi->moveToThread(thread);
connect(thread,SIGNAL(started()), wifi,SLOT(initWifi()));
thread->start();

网络类扩展:

WirelessNet::WirelessNet(QObject *parent, QThread *comThread): QTcpServer(parent)
{
clientThread = comThread;
}

void WirelessNet::initWifi()
{
listen(QHostAddress::Any, 5220);
connect(this,SIGNAL(newConnection()),this,SLOT(connectionRequest()));
}

void WirelessNet::connectionRequest()
{
client = this->nextPendingConnection();
if(client)
connect(client, SIGNAL(readyRead()), this, SLOT(receiveMessage()));
}

void WirelessNet:sendData(QByteArray msg)
{
if (client)
{
qDebug()<<"FIRST "<< client->thread() << " - " << this->thread() << "\n";
client->write(msg);
client->waitForBytesWritten();
qDebug()<<"LAST " << client->thread() << " - " << this->thread() << "\n";
}
}

(client和clientThread是类成员:分别是QTcpSocket*、QThread*)

调试

这是控制台在 sendData() 部分打印的内容:

FIRST QThread(0x7f66a0020be0) - QThread(0x7f66a0020be0)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x7f66980022e0), parent's thread is QThread(0x7f66a0020be0), current thread is QThread(0x7f66a0020e20)
QSocketNotifier: Can only be used with threads started with QThread
LAST QThread(0x7f66a0020be0) - QThread(0x7f66a0020be0)

总结

换句话说,我不知道应该在哪个对象上应用 moveToThread()。我已经尝试过 client->moveToThread(clientThread) 以及 this->moveToThread(clientThread)。不幸的是,我没有看到任何额外的对象来检查。

有人有想法吗?

最佳答案

您似乎是直接从主线程调用 WirelessNet:sendData。这会导致该函数内的所有内容也在主线程中运行。您的 client 位于新线程中,它不是线程安全的。它尝试创建子进程,但当前线程与 client 所在的线程不同。这就是您收到该错误消息的原因。

您可以简单地通过将 WirelessNet:sendData 设置为插槽并通过来自主线程的信号调用它来修复它。

关于c++ - 无法使用 QtNetwork,因为应用程序使用不同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36330298/

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