0

私はこのコードを持っている本当に奇妙な何かを持っています:

何が悪いのかはわかっていると思いますが、修正方法はわかりません。これは私が持っているものです: 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)));


}

プライベート スロットの下にある httpFinished() 関数: 決してトリガーされないのはなぜですか?

質問を更新しました

4

1 に答える 1

1

HttpClientおよびオブジェクトはスレッド内で作成されるためQNetworkAccessManager、それらは自動的にそのスレッドに属し (「 」を参照QObject::moveToThread)、QNAM が何らかの作業を行い、QObject派生クラスが実行できるようにするために、両方ともそのスレッドで実行されるイベント ループを必要とします。スロットを実行します。

QThread::exec()inへの呼び出しを追加して、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自分でスレッドを使用する必要がない場合もあります。

于 2012-10-20T20:13:58.323 に答える