QThread + QNetworkAccessManager + EventLoop
Verfasst: 4. April 2009 00:04
Habe folgendes Szenario:
Es gibt einen "LoaderThread" der im Hintergrund Bilder ladet. Derzeit hat der eine run() Methode in der er solange läuft solange ein Stack mit Bildern die er laden soll voll ist. Ist nichts mehr drinnen geht er schlafen. Sind neue Bilder zum Laden da wird er aufgeweckt, ladet die und schickt bei jedem Bild ein Signal raus, dass das Bild fertig ist.
Das ganze funktioniert wunderbar. Nur möchte ich diesen gerne erweitern, damit er auch Bilder aus dem Netz laden kann. Im Prinzip soll er einfach statt QImage::load ein QNetworkAccessManager::get aufrufen. Wenn dann das finished Signal kommt soll er das Bild aus dem QNetworkReply holen, und dann sein Signal schicken, dass das Bild fertig ist.
Das Problem an der Sache ist jetzt aber, dass ich anscheinend keine Signals im Thread empfangen kann (also keine Slots) solange ich keinen EventLoop laufen habe. Ich muss also QThread::exec aufrufen. So und jetzt steig ich aus. Verstehe ich das richtig, dass ich dann den Thread NUR mehr via Signals/Slots steuern kann? Ich kann den Thread dann nicht mehr in einem "Loop" laufen lassen und auch nicht mehr eigenhändig schlafen legen?
Falls ich das richtig verstehe: kann ich den EventLoop auch auf andere Weise verwenden - also ohne immer nur auf Events zu warten?
Kurz und bündig würd ich gerne einen Thread haben der in einer Schleife Dinge abarbeitet solange er was zu tun hat. Wenn nicht soll er schlafen gehen. Nur soll er auch Signals empfangen (Slots verarbeiten)
Hoffe das versteht jemand
Es gibt einen "LoaderThread" der im Hintergrund Bilder ladet. Derzeit hat der eine run() Methode in der er solange läuft solange ein Stack mit Bildern die er laden soll voll ist. Ist nichts mehr drinnen geht er schlafen. Sind neue Bilder zum Laden da wird er aufgeweckt, ladet die und schickt bei jedem Bild ein Signal raus, dass das Bild fertig ist.
Das ganze funktioniert wunderbar. Nur möchte ich diesen gerne erweitern, damit er auch Bilder aus dem Netz laden kann. Im Prinzip soll er einfach statt QImage::load ein QNetworkAccessManager::get aufrufen. Wenn dann das finished Signal kommt soll er das Bild aus dem QNetworkReply holen, und dann sein Signal schicken, dass das Bild fertig ist.
Das Problem an der Sache ist jetzt aber, dass ich anscheinend keine Signals im Thread empfangen kann (also keine Slots) solange ich keinen EventLoop laufen habe. Ich muss also QThread::exec aufrufen. So und jetzt steig ich aus. Verstehe ich das richtig, dass ich dann den Thread NUR mehr via Signals/Slots steuern kann? Ich kann den Thread dann nicht mehr in einem "Loop" laufen lassen und auch nicht mehr eigenhändig schlafen legen?
Falls ich das richtig verstehe: kann ich den EventLoop auch auf andere Weise verwenden - also ohne immer nur auf Events zu warten?
Kurz und bündig würd ich gerne einen Thread haben der in einer Schleife Dinge abarbeitet solange er was zu tun hat. Wenn nicht soll er schlafen gehen. Nur soll er auch Signals empfangen (Slots verarbeiten)
Hoffe das versteht jemand