Соединение QLocalSocket от QTConcurrent никогда не получало сигнал readyRead - PullRequest
0 голосов
/ 28 мая 2020

У меня соединение QLocalSocket, и я пытаюсь получить сигнал readyRead, когда данные доступны. Все отлично работает, если я запускаю весь код в одном потоке. Но если я запустил команду connectToServer в отдельном потоке, то этот readyRead сигнал никогда не испускается (или, возможно, просто никогда не получен).

Конструктор класса главного окна, упрощенный:

server = new ServerConn();

connect(server->socket, SIGNAL(connected()), this, SLOT(socketConnected()));
connect(server->socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
connect(server->socket, SIGNAL(readyRead()), this, SLOT(socketDataRead()));
connect(
    server->socket,
    QOverload<QLocalSocket::LocalSocketError>::of(&QLocalSocket::error),
    this,
    &MainWindow::socketError
);

В моем классе ServerConn у меня есть этот метод для подключения к сокету:

void ServerConn::Connect() {
    qDebug("ServerConn::Connect");
    socket->abort();
    socket->connectToServer("\\\\.\\pipe\\ICS0025", QIODevice::ReadWrite);

    if (!socket->waitForConnected(5000)) {
        qWarning(socket->errorString().toUtf8());
    }
}

Из моего класса главного окна я пытаюсь sh установить соединение с сокетом, а затем иметь возможность получать сигналы. Это на 100% отлично работает, если я сохраню все в одном потоке. Но если я попытаюсь подключиться в другом потоке, я не получу все сигналы.

QtConcurrent::run([this](){
    server->Connect();
});

Если я подключаюсь к сокету с помощью этого вызова, я не получаю disconnect и readyReady сигналов. Я все еще могу писать в сокет и получаю сигнал connected, но это все.

Если я уберу QtConcurrent::run([this](){ обертку вокруг вызова server->Connect, все будет работать отлично.

Что мне делать, чтобы иметь возможность постоянно принимать все сигналы?

...