2016-06-30 9 views
0

Ich bin neu in Qt und libcurl. Ich muss jetzt libcurl in meiner Qt-Anwendung verwenden. Ich begann mit:Verwenden von Libcurl richtig in Qt-Anwendung

m_res = curl_easy_perform(m_curl); 

Dann emittieren ich ein Signal, das diese Zeichenfolge in einer anderen Anwendung gibt

emit dataString (QString::fromStdString(dataBufferfromcurl)); 

ich dieses Signal in einer anderen Anwendung zu einem Schlitz angeschlossen habe. Aber wenn die Curl aufgerufen wird, blockiert sie das andere Programm, indem sie Daten liest. Kann mir jemand vorschlagen, wie man Licurl in einer Qt-Anwendung richtig einsetzt?

Hier einige mehr-complete code:

Class A : public QObject{ 
void init(){ 
if (m_curl){ 
    curl_easy_setopt(m_curl, CURLOPT_URL, "www.example.com"); 
    curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYPEER, 0L); // enabling ssl 
    curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYHOST, 0L); 
    curl_easy_setopt(m_curl, CURLOPT_CONNECTTIMEOUT, 0); 
    curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, WriteCallback); 
    curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this);// 

} 
void process(){ 
    if (m_curl) {  
    m_res = curl_easy_perform(m_curl); 
    } 
}; 

//************************************************************* 

class B : QThread{ 
    Q_OBJECT 
public: 
    void runProcess(){ 
    aObject = new A(); 
    ///************ few more connects 
    connect(aObject, SIGNAL(connectionError(QString)), this, SLOT(s_fireConnectionError(QString)), Qt::QueuedConnection); 
    QTimer::singleShot(1000, workingHTTPReader, SLOT(process())); 
    }  
} ; 

In der Klasse C, nenne ich B::runProcess():

void C:: getAllData() 
{ 
    bObject = new B; 
    bObject->runProcess(); //***********Problem  
} 

Wenn ich es auf diese Weise aufrufen, liest sie die Web-Seite Inhalte, aber die Ausführung der Rest der Anwendungsblöcke.

Wie kann ich das anrufen, ohne zu blockieren?

+0

Google: 'Qt :: QueuedConnection'. Oder verwenden Sie Multi-Threading. Es ist unklar, welche Probleme du hast. http://stackoverflow.com/help/how-to-ask –

+0

Hallo @ DmitrySazonov Danke für die Antwort. Und ich habe sowohl 'Qt :: Directconnection' und 'Qt :: Queued Verbindung' müde. Ich habe mein Problem ein wenig klar erklärt. Bitte schau es dir an. – Rampp

+0

Verwenden Sie QThread/QThreadPool/QtConcurrent für asynchrone Vorgänge. –

Antwort

0

aObject 's thread() ist Thread b, und Thread b nicht evnet loop .. Sie müssen Ereignisschleife im Thread starten. Wenn ein QObject keine Thread-Affinität hat (dh wenn thread() null zurückgibt) oder wenn es in einem Thread ohne laufende Ereignisschleife lebt, kann es keine in der Warteschlange befindlichen Signale oder geposteten Ereignisse empfangen.

+0

Danke, es ist mein Problem gelöst. – Rampp

0

Sie rufen B::runProcess() im selben Thread wie der Rest der Anwendung. Das Erstellen einer Klasse, die von QThread erbt, führt nicht automatisch dazu, dass alle ihre Methoden in einem anderen Thread ausgeführt werden.

Für Ihre Zwecke nutzen, um die einfachste Art und Weise zu erreichen, was Sie nach einem Thread-Pool zu erstellen (oder, einfacher gesagt, verwenden Sie die Standard-Thread-Pool der Anwendung), und die Methode Warteschlange dort auszuführen:

void C:: getAllData() 
{ 
    auto b = new B; 
    b->setAutoDelete(true); // if you're not deleting it yourself later 
    QThreadPool::globalInstance()->start(hello); 
} 

Klasse B muss von QRunnable erben statt QThread:

class B : public QRunnable 
{ 
public: 
    void run() Q_DECL_OVERRIDE; 
} 

Dies ist nur ein Umriss-Lösung; Sie sollten die Qt-Dokumentation von QRunnable und QThreadPool lesen, um zu verstehen, was Sie tun.