尽管没有使用std::thread
或QThread
在任何地方,仍然遇到以下问题:
- 始终来自 Qt 的运行时调试错误日志:
QObject::connect: 不能对“QAbstractSocket::SocketError”类型的参数进行排队
(确保使用 qRegisterMetaType() 注册了“QAbstractSocket::SocketError”。) - 方法间歇性崩溃
TcpSocket::flush()
;
我使用这种方法来确保立即写入 TCP;现在有时应用程序会在这种方法下完全崩溃SIGPIPE
在搜索互联网时,发现人们建议修复第一个问题(即元错误)qRegisterMetaType()
,当我们有多个线程时,我需要使用注册。
同样的多线程也被称为第二个问题的原因;看到这个和这个。
但我没有超过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个问题?