我有一些非常奇怪的东西,我有这段代码:
我想我知道出了什么问题,但我不知道如何解决。 这就是我所拥有的: 当我在 int test = 0; 中放置断点时 它在到达 HttpClient 中的 httpFinished() 插槽之前到达那里,这就是问题所在吗? 在 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)));
}
私有(private)槽下的 httpFinished() 函数:从未触发,为什么?
更新了问题
最佳答案
由于 HttpClient
和 QNetworkAccessManager
对象是在线程内创建的,它们自动属于该线程(参见 QObject::moveToThread
),并且它们都需要运行事件循环在该线程中,QNAM 可以完成任何工作,并且您的 QObject
派生类能够执行插槽。
您可以在 run()
中添加对 QThread::exec()
的调用以运行该事件循环(如果您使用的是 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();
}
此外,since Qt 4.8 , QNetworkAccessManager
是多线程的,因此您可能不需要自己使用线程。
关于c++ - Qt 请求从不触发 finished() 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990675/