2016-08-04 3 views
0

に、スレッドから発する++別のスレッド、POST-検索を行うとQTextBrowserにデータを挿入する:QtのCはQTextBrowserにデータを表示するメインメイン・ウィンドウクラス(GUI)のスロットがあり、スロットGUI

QNetworkRequest request(apiUrl); 

request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"); 
request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
request.setRawHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3"); 
request.setRawHeader("Accept-Encoding", "identity"); 
request.setRawHeader("Connection", "keep-alive"); 
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); 

reply = manager.post(request, "data="+data); 

connect(reply, &QNetworkReply::finished,this, &MakePost::getReplyFinished); 
connect(reply, &QNetworkReply::readyRead, this, &MakePost::readyReadReply); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(GetError())); 

void MakePost::readyReadReply() 
{ 
    QString GetRes = QString::fromUtf8(reply->readAll()); 
    qDebug() << "GetRes: " + GetRes; 
    emit SendLog(GetRes); 
} 

コールスレッド:

QThread *postThread = new QThread; 
MakePost *sendPost = new MakePost(); 
sendPost->SetParam(Data, SubUrl, requestString); 

sendPost->moveToThread(postThread); 
sendPost->manager.moveToThread(postThread); 
connect(postThread, SIGNAL(started()), sendPost, SLOT(MakePostSignal())); 
postThread->start(); 

と接続スロットメインウィンドウで-stream:

connect(SendPost, SIGNAL(SendLog(QString)), this, SLOT(setLogs(QString))); 

私はスレッドで実行する場合、すべてのは、罰金をうまくスレッドのみqDebug()< < "GetRes:" 結果受信whithout + GetResを。すべて...

スレッドとGUIの間にシグナルスロットの接続を作成する方法を教えてください。 ありがとう!

+0

setLogsには2つのパラメータがありますが、connect関数には1つしか表示されません。これが問題だろうか? – Dillydill123

答えて

1

ワーカースレッドでは、ネットワーク要求はすでに非同期に処理されています。これは、QNetworkAccessManagerの処理です。ミックスにもう1つのスレッドを追加する必要はありません。

他のCPUバインドの1回限りのタスクについては、QtConcurrent::runを介してデフォルトのスレッドプールを活用する必要があります。スレッドの作成と破壊は高価です。スレッドプールは、アプリケーションのワーカースレッドの必要性を世界的に把握し、その寿命を最も効率的に管理するために独自に配置されています。入出力バインドタスクの場合は、最初の引数としてQtConcurrent::runに渡される2番目のスレッドキューを使用する必要があります。

関連する問題