Threads: Objekte erzeuegen und löschen. Bsp. aus Qt Buch.
Verfasst: 10. November 2009 22:21
Hallo Forumgemeinde,
ich habe Fragen zur Erzeugung und Löschung von Objekten im Zusammenhang mit Threads.
Im Buch "C++ Gui Programmierung mit QT4"(http://www.addison-wesley.de/9783827327291.html) habe ich ein Beispiel gefunden, das genau mein Problem behandelt. (Kapitel 4.13 Kommunikation mit hauptthread S.437 )
Das Beispiel heißt "imagepro", und kann auf der o.g seite heruntergeladen werden.
Kurz zusammengefasst: es ist eine Bildberabeitungsanwendung.
Es gibt einen Mainthread, der alle Dialoge, Menüs u.s.w erstellt. Dann gibt es einen Thread, dass die Bildmanipulationen durchfuhrt. Der Maintthread kommuniziert mit dem Unterthread indem er in eine Warteschlange des Unterthreads (Queue) Befehle (Transaktionen) ablegt.
imagewindow.cpp:
Der Unterthread wird aufgeweckt. Nach der Abarbeitung aller Auftrage geht er wieder ins wait.
Transactionthread.cpp:
Jetzt komt's: Die Befehle(= Transaktions) sind eigentlich Objekte. Wenn der User eine Aktion durchgefuhrt haben möchte, dann erzeugt der Mainthread ein neues Transaction Objekt. Dann fügt er einen Pointer auf soeben erstelletes Objekt in die Warteschlange des Threads (alles schön mit mutexen gesichert).
Und der Thread löscht dann in seiner Run Methode die Transaktion mit
"delete pointeraufrausgehohlteTransaktion", sobald sie ausgeführt wurde.
Also zusammen gefasst: Mainthread erzeugt Objekte, Unterthread löscht sie. (Stimmt das überhaupt?) Dann nächste Frage:
Im gleichen Buch auf S.445 steht Fett markieret: "QObject-Instanzen mussen in demselben Thread gelöscht werden, in dem sie erstellt wurden."
Da stimmt was nicht, (oder ich habe was falsch verstanden.)
Könnte mir bitte jemand helfen?
P.S. Beispiel funktioniert ohne Fehlemeldungen.
Vielen Dank.
ich habe Fragen zur Erzeugung und Löschung von Objekten im Zusammenhang mit Threads.
Im Buch "C++ Gui Programmierung mit QT4"(http://www.addison-wesley.de/9783827327291.html) habe ich ein Beispiel gefunden, das genau mein Problem behandelt. (Kapitel 4.13 Kommunikation mit hauptthread S.437 )
Das Beispiel heißt "imagepro", und kann auf der o.g seite heruntergeladen werden.
Kurz zusammengefasst: es ist eine Bildberabeitungsanwendung.
Es gibt einen Mainthread, der alle Dialoge, Menüs u.s.w erstellt. Dann gibt es einen Thread, dass die Bildmanipulationen durchfuhrt. Der Maintthread kommuniziert mit dem Unterthread indem er in eine Warteschlange des Unterthreads (Queue) Befehle (Transaktionen) ablegt.
imagewindow.cpp:
Code: Alles auswählen
...
void ImageWindow::flipHorizontally()
{
addTransaction(new FlipTransaction(Qt::Horizontal));
}
void ImageWindow::addTransaction(Transaction *transact)
{
thread.addTransaction(transact);
openAction->setEnabled(false);
saveAction->setEnabled(false);
saveAsAction->setEnabled(false);
}
...
Transactionthread.cpp:
Code: Alles auswählen
...
void TransactionThread::addTransaction(Transaction *transact)
{
QMutexLocker locker(&mutex);
transactions.enqueue(transact);
transactionAdded.wakeOne();
}
void TransactionThread::run()
{
Transaction *transact = 0;
QImage oldImage;
forever {
{
QMutexLocker locker(&mutex);
if (transactions.isEmpty())
transactionAdded.wait(&mutex);
transact = transactions.dequeue();
if (transact == EndTransaction)
break;
oldImage = currentImage;
}
emit transactionStarted(transact->message());
QImage newImage = transact->apply(oldImage);
delete transact;
{
QMutexLocker locker(&mutex);
currentImage = newImage;
if (transactions.isEmpty())
emit allTransactionsDone();
}
}
}
...
Und der Thread löscht dann in seiner Run Methode die Transaktion mit
"delete pointeraufrausgehohlteTransaktion", sobald sie ausgeführt wurde.
Also zusammen gefasst: Mainthread erzeugt Objekte, Unterthread löscht sie. (Stimmt das überhaupt?) Dann nächste Frage:
Im gleichen Buch auf S.445 steht Fett markieret: "QObject-Instanzen mussen in demselben Thread gelöscht werden, in dem sie erstellt wurden."
Da stimmt was nicht, (oder ich habe was falsch verstanden.)
Könnte mir bitte jemand helfen?
P.S. Beispiel funktioniert ohne Fehlemeldungen.
Vielen Dank.