QTcpSocket или QSslSocket автоматически создают поток для чтения / записи?

Несмотря на не использование std::thread или же QThread в любом месте, все еще возникают следующие проблемы:

  1. Всегда журнал ошибок отладки во время выполнения из Qt:

    QObject :: connect: Невозможно поставить в очередь аргументы типа ‘QAbstractSocket :: SocketError’
    (Убедитесь, что QAbstractSocket :: SocketError зарегистрирован с использованием qRegisterMetaType ().)

  2. Прерывистая авария на 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 проблемы?

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.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]