Qt-запрос никогда не запускает сигнал Finish ()

У меня есть что-то действительно странное, у меня есть этот код:

Я думаю, что знаю, что не так, но я не знаю, как это исправить.
вот что у меня есть:
когда я ставлю точку останова в int test = 0;
Это происходит до того, как он попадет в слот httpFinished () в HttpClient, может быть, это проблема?
в main.cpp

---------------------------------------------------------------------------------------------------------
@while (i.hasNext())
{
i.next();

ThreadWorker* pThreadWorker = new ThreadWorker();
pThreadWorker->setUrl(sUrl);
QThreadPool::globalInstance()->start(pThreadWorker);
}
QThreadPool::globalInstance()->waitForDone();---------------------------------------------------------------------------------------------------------
void ThreadWorker::run()
{
startWork();
}

void ThreadWorker::startWork()
{
m_pHttpClient = new HttpClient();
m_pHttpClient->startRequest(m_url);
int test = 0;}

--------------------------------- HttpClient  based on the http example from Qt -----------------------------------

HttpClient::HttpClient()
{
m_networkManager = new QNetworkAccessManager(this);
connect(m_networkManager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),
this, SLOT(slotAuthenticationRequired(QNetworkReply*,QAuthenticator*)));

#ifndef QT_NO_OPENSSL
connect(m_networkManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
this, SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
#endif
}void HttpClient::startRequest(QUrl url)
{
m_url.setUrl("http://qt.nokia.com/");
QNetworkRequest request;
request.setUrl(m_url);

reply = m_networkManager->get(request);connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));

connect(reply,SIGNAL(finished()),
this, SLOT(httpFinished()));

connect(reply, SIGNAL(readyRead()),
this, SLOT(httpReadyRead()));

connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(updateDataReadProgress(qint64,qint64)));}

функция httpFinished (), которая находится в частных слотах: никогда не срабатывает, почему?

ОБНОВЛЕН ВОПРОС

0

Решение

Так как HttpClient а также QNetworkAccessManager объекты создаются внутри потока, они автоматически принадлежат этому потоку (см. QObject::moveToThread), и им обоим нужен цикл обработки событий в этом потоке, чтобы QNAM мог выполнять какую-либо работу вообще, и для вашего QObject Производный класс, чтобы иметь возможность выполнять слоты.

Вы можете добавить звонок QThread::exec() в run() запустить этот цикл событий (если вы использовали QThread):

void Thread::run()
{
startWork();
exec();
}

или создать и начать QEventLoop чья quit() Слот должен быть подключен где-то, чтобы остановить цикл (например, finished() сигнал в классе HttpClient что бы вы выпустили, когда работа сделана)

void ThreadWorker::run()
{
startWork();
QEventLoop loop;
QObject::connect(m_pHttpClient, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
}

Также, с Qt 4.8, QNetworkAccessManager является многопоточным, поэтому вам не нужно использовать потоки самостоятельно.

1

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

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

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