QT C ++ - проблема с классом, дождаться обработки сигнала и вернуть данные обратно - PullRequest
1 голос
/ 27 августа 2011

У меня есть этот код в программе, которую я создаю, но у меня проблема: как я могу заставить программу ждать данные в http2, прежде чем вернуться в класс tcpserver? И как я могу получить данные в классе tcpserver?

Это похоже на контрольную точку, где мне нужно получить данные с сервера, а затем продолжить работу tcpserver и использовать эти данные там.

tcpserver.cpp

#include "tcpserver.h"
#include "protocol.h"
#include "http2.h"

QTextStream in(stdin);

tcpserver::tcpserver(QObject *parent) :
    QObject(parent)
{
    server = new QTcpServer(this);

    [ ... Other Server Stuff ... ]

    http2 *h = new http2(this); 

}

Я попробовал это без удачи:

http2.cpp

#include "http2.h"
bool httpdonne = false;
QByteArray finaldata;

http2::http2(QObject *parent, QByteArray url, QByteArray data) :
    QObject(parent)
{
    url.append(data);

    m_manager = new QNetworkAccessManager(this);
    connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpdown(QNetworkReply*)));

    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

    m_manager->get(request);

    while ( httpdonne == false ) {

    }

    finaldata.append("HTTP: ");
    qDebug() << finaldata;

}

QByteArray http2::httpdown(QNetworkReply* result)
{
    QByteArray data = result->readAll();
    finaldata = data;
    httpdonne = true;
    return data;
}

Большое спасибо! ;)

Ответы [ 4 ]

2 голосов
/ 27 августа 2011

Qt использует сигналы и слоты и цикл событий .Если у вас нет запуска QEventLoop, который обычно предоставляется QApplication, ваши события не будут обработаны.

Взгляните на этот вопрос , чтобы увидеть, как создать цикл событийИмитация блокировки (синхронная) с использованием модели асинхронного программирования .

Кроме того, я обычно добавляю также QTimer:

QEventLoop loop;
..
QTimer timer;
timer.setInterval(2000);
timer.setSingleShot(true);
loop.connect(&timer, SIGNAL(timeout()), SLOT(handleTimeout()));
timer.start();
..
//Setup your objects / connections here...
..
loop.exec(); //Your signals and slots will be triggered / handled now!
1 голос
/ 27 августа 2011

Все классы сети Qt управляются сигналом.То есть вы создаете функции, которые обрабатывают различные события (данные готовы и т. Д.) И подключаете их к соответствующим слотам.Блокирование не совсем то, как их нужно использовать.

0 голосов
/ 26 июня 2015

Вы можете использовать мой класс WaitForSignalHelper, размещенный здесь , он делает то, что вы хотите: дождитесь истечения времени ожидания ИЛИ сигнала ...

0 голосов
/ 27 августа 2011

Конечно, я бы никогда не порекомендовал, чего вы пытаетесь достичь, но если вы все еще хотите «выстрелить себе в ногу» :), вот что вы можете попробовать,

запустить менеджер какотдельный поток и заставить поток http2 или tcpserver ожидать переменную условия.И когда менеджер закончил, вызовите потоки, ожидающие переменную условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...