[gelöst]Kommunikation zwischen GuiThread/Thread
Verfasst: 22. Mai 2012 09:19
Hi, habe ein Problem:
Ich habe eine GUI Applikation, die mit einem Thread arbeitet. Ich erzeuge ein Objekt(abgeleitet von QObject mit Q_OBJECT Makro), dass eine Methode create hat und einen aufwendigen Prozess in einem eigenen Thread abarbeiten soll. Also erzeuge ich auch einen abgeleiteten QThread der in der run Methode exec(); aufruft.
Mit
verschiebe ich mein Objekt in den Thread und verbinde alle nötigen Signale und Slots.
Bei den Komminkationsslots ist meist der Guithread der Empfänger und das Object im Thread der Sender(z.B senden eined Status oder Fehler der in MessageBox angezeigt wird.).
Nur während des Prozesses im Thread kann es sein, dass vom User eine Entscheidung getroffen werden muss. So sendet der Thread mit emit ein Signal mit einer QList<IrgendeinObject*>* als Parameter. Nach dem Senden dieses Signals wird im Thread Object eine QEventLoop mit exec gestartet.
Der MainThread hat einen Slot, der durch dieses Signal ausgeführt wird und zeigt die Möglichkeiten in einem QTableWidget an. Der User wählt aus und das Ergebnis wieder eine QList<>* soll mit einem Signal emit an einen Slot des Objekts im Thread gesendet werden.
Jetzt treten Probleme auf: Bei einem DualCore Prozessor wird der Slot ausgeführt, aber ca. alle 10 mal tritt dieser Fehler auf:
und das Programm stürzt ab.
Bei einem Single Core Prozessor wird der Slot nie ausgeführt.
Die Kommunikationsslots sind alle Qt::QueuedConnection.
Ist die QEventLoop das Problem, denn ich habe ja im Thread eine EventLoop wegen exec(), und dann auch im Objekt, während es auf die Antwort wartet...
Kann mir jemand helfen?? = )
Ich habe eine GUI Applikation, die mit einem Thread arbeitet. Ich erzeuge ein Objekt(abgeleitet von QObject mit Q_OBJECT Makro), dass eine Methode create hat und einen aufwendigen Prozess in einem eigenen Thread abarbeiten soll. Also erzeuge ich auch einen abgeleiteten QThread der in der run Methode exec(); aufruft.
Mit
Code: Alles auswählen
my_object->moveToThread(my_thread);Bei den Komminkationsslots ist meist der Guithread der Empfänger und das Object im Thread der Sender(z.B senden eined Status oder Fehler der in MessageBox angezeigt wird.).
Nur während des Prozesses im Thread kann es sein, dass vom User eine Entscheidung getroffen werden muss. So sendet der Thread mit emit ein Signal mit einer QList<IrgendeinObject*>* als Parameter. Nach dem Senden dieses Signals wird im Thread Object eine QEventLoop mit exec gestartet.
Code: Alles auswählen
emit signal(list_irgendeinobject);
qDebug() << " - Waitloop START";
waitloop.exec();
qDebug() << " - Waitloop END";
Code: Alles auswählen
void My_Object::result_slot(QList<Field *> *decide_list)
{
qDebug() << "BaseExport::decided(QList<MatchingSetField *> *decide_list)";
waitloop.quit();
}
Code: Alles auswählen
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
Bei einem Single Core Prozessor wird der Slot nie ausgeführt.
Die Kommunikationsslots sind alle Qt::QueuedConnection.
Ist die QEventLoop das Problem, denn ich habe ja im Thread eine EventLoop wegen exec(), und dann auch im Objekt, während es auf die Antwort wartet...
Kann mir jemand helfen?? = )