gpt4 book ai didi

c++ - QTcpSocket 或 QSslSocket 是否自动创建读/写线程?

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:45 24 4
gpt4 key购买 nike

尽管没有在任何地方使用std::threadQThread,仍然遇到以下问题:

  1. 总是来自 Qt 的运行时调试错误日志:

    QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'
    (Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().)

  2. TcpSocket::flush() 方法间歇性崩溃;
    我使用这种方法来确保立即写入 TCP;现在有时应用程序会在使用 SIGPIPE
  3. 的方法中崩溃

在互联网上搜索后,发现人们建议解决第一个问题(即元错误),当我们有多个线程时,我需要使用 qRegisterMetaType() 进行注册。
相同的多线程也被称为第二个问题的原因;见 thisthis .

但我没有超过 1 个线程!
我的套接字代码如下所示:

struct Socket : public QSslSocket
{
Q_OBJECT public:

void ConnectSlots ()
{
const auto connectionType = Qt::QueuedConnection;
connect(this, SIGNAL(readyRead()), this, SLOT(ReceiveData()), connectionType);
connect(this, SIGNAL(disconnected()), this, SLOT(Disconnected()), connectionType);
connect(this, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(Error(QAbstractSocket::SocketError)), connectionType);
// ^^^^^^^ error comes whether I comment this or not
}

public slots:
void ReceiveData () { ... }
void Disconnected () { ... }
void Error () { ... }
}

问题:Qt 是否为读/写目的自行创建任何内部线程? (我希望不是)。如何解决以上 2 个问题?

最佳答案

我不认为问题与线程有关,而是QAbstractSocket::SocketError 类型参数 Qt::QueuedConnection< 的组合 导致问题的原因。

查看 Qt5.8 源代码中的各种 connect 实现,如果 Qt::QueuedConnection 被指定为连接类型,则检查信号的参数类型将被执行。像...

int *types = 0;
if ((type == Qt::QueuedConnection)
&& !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) {
return QMetaObject::Connection(0);
}

如果任何类型未注册,queuedConnectionTypes 将返回空指针。

因此,如果连接排队,则必须注册 信号 使用的所有参数,无论它们是否被插槽使用。为避免错误,请确保您调用...

qRegisterMetaType<QAbstractSocket::SocketError>();

在使用QAbstractSocket::SocketError 参数和Qt::QueuedConnection 的组合调用connect 之前的某个时刻。

关于c++ - QTcpSocket 或 QSslSocket 是否自动创建读/写线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45077696/

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