Несмотря на не использование std::thread
или же QThread
в любом месте, все еще возникают следующие проблемы:
QObject :: connect: Невозможно поставить в очередь аргументы типа ‘QAbstractSocket :: SocketError’
(Убедитесь, что QAbstractSocket :: SocketError зарегистрирован с использованием qRegisterMetaType ().)
TcpSocket::flush()
Способ;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 проблемы?
Я не думаю, что проблема связана с потоками, скорее это сочетание QAbstractSocket::SocketError
параметр типа а также Qt::QueuedConnection
это вызывает проблему.
Глядя на различные connect
реализации в источнике Qt5.8, если Qt::QueuedConnection
В качестве типа подключения указывается проверка типов параметров сигнала. Что-то вроде…
int *types = 0;
if ((type == Qt::QueuedConnection)
&& !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) {
return QMetaObject::Connection(0);
}
где queuedConnectionTypes
вернет нулевой указатель, если какой-либо из типов не зарегистрирован.
Таким образом, если соединение ставится в очередь, то все параметры, используемые сигнал должны быть зарегистрированы независимо от того, используются ли они слотом. Чтобы избежать ошибки, обязательно позвоните …
qRegisterMetaType<QAbstractSocket::SocketError>();
один раз в какой-то момент перед любыми звонками connect
которые используют комбинацию QAbstractSocket::SocketError
параметр и Qt :: QueuedConnection.
Других решений пока нет …