У меня есть что-то действительно странное, у меня есть этот код:
Я думаю, что знаю, что не так, но я не знаю, как это исправить.
вот что у меня есть:
когда я ставлю точку останова в 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 (), которая находится в частных слотах: никогда не срабатывает, почему?
ОБНОВЛЕН ВОПРОС
Так как 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
является многопоточным, поэтому вам не нужно использовать потоки самостоятельно.
Других решений пока нет …