Pergunta

Existe alguma maneira de fazer uma função pausar sua execução até que o soquete receba uma mensagem específica?Usar Signals + QEventLoop para esperar não funciona porque, embora possa esperar por sinais, não há como obter os dados que o sinal emitiu (ou existe?).

Foi útil?

Solução

Você pode se conectar ao seguinte sinal:

void QIODevice::readyRead() [sinal]

Então, você basicamente leria os dados e se for o que você está procurando, você poderia definir uma variável booleana como verdadeira que é inicialmente falsa.Sua função continuaria a execução somente quando a variável fosse verdadeira.

Certifique-se de que a função pausada não esteja dormindo demais de maneira sincronizada, etc., sem ter um thread dedicado.

Então, esta seria uma forma de resolver sua tarefa:

MySocketManager::MySocketManager(QObject *parent): QObject(parent)
{
    ...
    connect(m_mySocket, SIGNAL(readyRead()), SLOT(handleReadyRead()));
    ...
}

void MySocketManager::handleReadyRead()
{
    if (m_mySocket.readAll() == "myMessage")
        continue = true;
}

...

void myFunction()
{
    ...
    continue = false;
    qDebug() << "Pause";
    while (!continue) { ... }
    qDebug() << "Continue";
    ...
}

Esta é uma pequena simplificação do problema, mas como você não demonstrou muito esforço além de pedir uma solução, isso deve ajudá-lo a começar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top