2016-08-04 11 views
0

Es gibt einen Schlitz in der Hauptklasse Hauptfenster (GUI), die Daten in QTextBrowser zeigt:Qt C++ emittieren aus dem Thread, in den Schlitz GUI

void MainWindow::setLogs(QString param, QString text) { 
    qDebug()<<text; 
    ui->Logs->append(text); 
} 

es eine Klasse ist, die in einem läuft separater Thread, POST-Suche macht und die Daten in QTextBrowser einzufügen:

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); 
} 

Der Anruf thread:

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(); 

und eine Verbindungsschlitz -Strom in Hauptfenster:

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

whithout alle Faden feinen trainieren, wenn ich in Thread laufen nur qDebug führen empfangen wird() < < "GetRes:" + GetRes; und all ...

Bitte helfen, wie eine Verbindungs ​​von Signal-Slot zwischen dem Faden und GUI erstellen? Danke!

+0

setLogs hat zwei Parameter, aber Sie zeigen nur einen in der Verbindungsfunktion. Könnte das das Problem sein? – Dillydill123

Antwort

1

Die Netzwerkanforderungen sind bereits asynchron in einem Worker-Thread behandelt: das ist, was QNetworkAccessManager tut. Sie müssen dem Mix keinen weiteren Thread hinzufügen.

Für andere CPU-gebundenen einmalige Aufgaben, sollten Sie den Standardthreadpool über QtConcurrent::run nutzen. Thread-Erstellung und -Zerstörung ist teuer und der Thread-Pool ist einzigartig positioniert, um globale Kenntnisse über den Bedarf Ihrer Anwendung an Worker-Threads zu haben und deren Lebensdauern am effizientesten zu verwalten. Für I/O-gebundene Aufgaben sollten Sie eine zweite Thread-Warteschlange verwenden, die als erstes Argument an QtConcurrent::run übergeben wird.

Verwandte Themen