2012-10-20 46 views
0

我有一些奇怪的东西我有这样的代码:Qt的要求从来没有触发成品()信号

我想我知道我不什么是错的,但知道如何解决它。 这是我有: 当我把断点在int测试= 0; 在它到达HttpClient中的httpFinished()槽之前,mybe这是问题吗? 在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()函数是在私有槽:从不触发,为什么呢?

更新问题

回答

1

由于HttpClientQNetworkAccessManager对象的线程内创建,它们自动地属于该线程(见QObject::moveToThread),并且它们都需要一个事件循环在该线程运行时,QNAM根本无法做任何工作,并且您的派生类能够执行这些插槽。

你可以在run()添加调用QThread::exec()来运行事件循环(如果你使用QThread):

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

或创建并启动QEventLoopquit()插槽在某处被连接到停止环(例如在类HttpClient一个finished()信号时,工作完成后,你会发出):

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

而且,since Qt 4.8,QNetworkAccessManager是多线程的,所以你可能不需要自己使用线程。

+0

谢谢我知道在4.8它是MT,但我需要在线程中做更多的工作,不仅http http req,线程如何知道它的完成? – user63898

+0

@ user63898线程不会自行停止,您需要调用其插槽'quit()'(或将其连接到应答“finished()”信号)来停止事件循环和线程。 – alexisdm

+0

错误C3861:'exec':标识符未找到,可以吗? – user63898