QTcpSocket переподключиться к серверу без блокировки графического интерфейса - PullRequest
0 голосов
/ 26 октября 2018

У меня есть клиент-серверное приложение, которое работает как чудо, когда сервер запускается раньше клиента, но, поскольку я не знаю, запускается ли сервер первым, мне нужно, чтобы клиент продолжал пытаться подключиться к серверу без блокировки интерфейса. Лучшее, что мне пришло в голову, это сделать такой цикл

void client::initConnection(){
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(clientConnected()));
    connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnectedFromHost()));

    while (tcpSocket->state() != QAbstractSocket::ConnectedState) {
    tcpSocket->abort();
    tcpSocket->connectToHost(address, port, QIODevice::ReadWrite);
    tcpSocket->waitForConnected(1000);
    }
}

но если я вызываю этот код в основном потоке, он блокирует графический интерфейс (по понятным причинам), я подумал, что мне, возможно, придется использовать потоки, но кажется, что на самом деле невозможно работать с сокетом из потока, отличного от того, который был создан в. Так, может быть, есть способ запустить этот метод, не блокируя графический интерфейс и не меняя архитектуру моего приложения?

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете использовать QObject :: startTimer и QObject :: timerEvent методы вашего client класса (похоже, он унаследован от QObject) следующим образом:

void client::initConnection(){
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(clientConnected()));
    connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnectedFromHost()));

    // checkConnectionTimerId - is a member of class `client`
    checkConnectionTimerId = startTimer(1000);
}


void client::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == checkConnectionTimerId) {
        if (tcpSocket->state() != QAbstractSocket::ConnectedState) {
            tcpSocket->connectToHost(address, port, QIODevice::ReadWrite);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...