2012-01-13 14 views
2

私はGETリクエストを要求する必要があります。応答を処理するためにシグナルを使用する必要があり、応答を処理済みのフォームに戻す必要があります。私はThreading Wihtout the Headacheに記述されているようにコードを構成しましたが、私が実行すると応答は受信されず、処理されません。スレッドを使用して信号とスロットを処理する

// Set-up request 
QNetworkAccessManager* pConnection(new QNetworkAccessManager()); 
connect(pConnection, 
     SIGNAL(finished(QNetworkReply*)), 
     this, 
     SLOT(process(QNetworkReply*))); 
QUrl url; 
url.setUrl(HOST); 
url.addQueryItem("P1", "Hi"); 
url.addQueryItem("P2", "Bob"); 

// Send request 
QNetworkRequest request(url); 
pConnection->get(request); 

// Wait for reply 
QThread* pResponce(new QThread(this)); 
connect(this, 
     SIGNAL(processingFinished()), 
     pResponce, 
     SLOT(quit())); 
pConnection->moveToThread(pResponce); 
pResponce->start(); 
pResponce->wait(); 
pConnection->deleteLater(); 
pResponce->deleteLater(); 
return this->processedReply; 

明らかに私は何かが不足していますが、何ですか?私はスレッド(および削除)を使用していないときに動作します。したがって、URLまたはサーバーではありません。

答えて

4

他のスレッドでイベントループを設定しないと、メイン/ guiスレッドのみがシグナルを受信します。

イベントループが実行されていない場合、イベントはオブジェクトに配信されません。たとえば、スレッド内にQTimerオブジェクトを作成してもexec()を呼び出さない場合、QTimerはtimeout()シグナルを出力しません。 deleteLater()を呼び出すこともできません。 (これらの制限は、同様にメインスレッドに適用されます。)

出典:http://doc.qt.digia.com/4.6/threads-qobject.html

QThread::exec()を参照してください。 そのため、QThreadExクラスがリンクされている例では、コードスニペットではなく、QThreadExクラスが導入され、使用されています。

関連する問題