c++ - Qt 请求从不触发 finished() 信号

标签 c++ qt qthread

我有一些非常奇怪的东西,我有这段代码:

我想我知道出了什么问题,但我不知道如何解决。 这就是我所拥有的: 当我在 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() 函数:从未触发,为什么?

更新了问题

最佳答案

由于 HttpClientQNetworkAccessManager 对象是在线程内创建的,它们自动属于该线程(参见 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/

相关文章:

python - 停止 qthread 中长时间运行的进程

c++ - 用 unit64_t 左移 - 发出警告

c++ - QStandarditem 拒绝构造函数中的 QString

qt - QList内存释放

xml - 如何返回 QDomDocument 中的根元素?

c++ - 将 C++11 线程操作与 QThread 操作混合

c++ - Visual Studio 无法识别 CUDA 的 "ThreadIdx"

C++:可变长度多维数组

c++ - 互斥量可以挂起执行吗?

c++ - 使用 QThreads 未正确使用 CPU 内核