[gelöst] Signal-Slot Verbindung über Thread-Grenzen
Verfasst: 28. April 2009 10:46
Hallo,
In meinem Code sind folgende Klassen:
1. Tconnection_manager
Diese Klasse läuft im Main-Thread.
2. Tconnection_thread
Diese Klasse ist von QThread abgeleitet.
Sie enthält weiterhin ein Attribut das den Pointer
auf auf ein Objekt von Tconnection_manager enthält.
Dieser wird dann an Tconnection weitergereicht.
3. Tconnection
Diese Klasse leitet sich von QTcpSocket ab.
Sie wird in Tconnection_thread::run deklariert (läuft also im eigenen Thread).
Sie besitzt folgende Methoden :
listen()
Diese Methode speichert alle Daten die über den Socket kommen in ein Objekt vom Typ QByteArray.
Wenn keine Daten mehr kommen soll es diese über eine Signal -Slot-Verbindung zu einem Object der Klasse Tconnection_manager weiterreichen.
Der Slot send(QByteArray data)
Wenn dieser Slot ein Signal erhält soll er die Daten des mitgelieferten Arrays versenden.
Ich habe nun folgende Fragen:
1. Ist eine Signal-Slot-Verbindung der Objekt von Tconnection mit Tconnection_manager überhaupt möglich ?
Tconnection ist von QTcpSocket abgeleitet.
In der Dokumentation finde ich folgendes:
"Event driven objects may only be used in a single thread. Specifically, this applies to the timer mechanism and the network module. For example, you cannot start a timer or connect a socket in a thread that is not the object's thread."
Weiter unten steht in der Dokumentation:
"Each thread can have its own event loop. The initial thread starts its event loops using QCoreApplication::exec(); other threads can start an event loop using QThread::exec(). Like QCoreApplication, QThread provides an exit(int) function and a quit() slot.
An event loop in a thread makes it possible for the thread to use certain non-GUI Qt classes that require the presence of an event loop (such as QTimer, QTcpSocket, and QProcess). It also makes it possible to connect signals from any threads to slots of a specific thread. This is explained in more detail in the Signals and Slots Across Threads section below."
Bedeutet dass, das wenn ich Tconnection_thread mit exec() aufrufe und queud connection verwende eine Verbindung von Objekten deren Klassen von QTcpServer abgeleitet sind zu Objekten in anderen Threads doch möglich ist ?
Oder bringe ich da etwas durcheinander ?
2. Wenn ich über eine Signal-Slot-Verbindung, die Objekte in unterschiedlichen Threads verbindet,Daten in Form eines QByteArray Objektes austausche ist dann eine Tiefenkopie (deep copy) erforderlich ?
Was passiert eigentlich mit Objekten , die vor dem Beenden des Threads nicht zerstört wurden ?
Sind nur ihre Ressourcen nicht freigegeben worden und ich kann mit einem Pointer, der auf sie zeigt und den ich zuvor an einen anderen Thread übergeben habe dort mit diesen Objeken weiter arbeiten oder droht ein Absturz ?
Den Artikel über Implicit Sharing habe ich leider nicht verstanden.
3. Ich möchte die Methode (Slot) send(QByteArray data) der Klasse Tconnection mit einem Mutex schützen.
Wo muss ich den Deklarieren ?
Vielen Dank für eure Antworten
In meinem Code sind folgende Klassen:
1. Tconnection_manager
Diese Klasse läuft im Main-Thread.
2. Tconnection_thread
Diese Klasse ist von QThread abgeleitet.
Sie enthält weiterhin ein Attribut das den Pointer
auf auf ein Objekt von Tconnection_manager enthält.
Dieser wird dann an Tconnection weitergereicht.
3. Tconnection
Diese Klasse leitet sich von QTcpSocket ab.
Sie wird in Tconnection_thread::run deklariert (läuft also im eigenen Thread).
Sie besitzt folgende Methoden :
listen()
Diese Methode speichert alle Daten die über den Socket kommen in ein Objekt vom Typ QByteArray.
Wenn keine Daten mehr kommen soll es diese über eine Signal -Slot-Verbindung zu einem Object der Klasse Tconnection_manager weiterreichen.
Der Slot send(QByteArray data)
Wenn dieser Slot ein Signal erhält soll er die Daten des mitgelieferten Arrays versenden.
Ich habe nun folgende Fragen:
1. Ist eine Signal-Slot-Verbindung der Objekt von Tconnection mit Tconnection_manager überhaupt möglich ?
Tconnection ist von QTcpSocket abgeleitet.
In der Dokumentation finde ich folgendes:
"Event driven objects may only be used in a single thread. Specifically, this applies to the timer mechanism and the network module. For example, you cannot start a timer or connect a socket in a thread that is not the object's thread."
Weiter unten steht in der Dokumentation:
"Each thread can have its own event loop. The initial thread starts its event loops using QCoreApplication::exec(); other threads can start an event loop using QThread::exec(). Like QCoreApplication, QThread provides an exit(int) function and a quit() slot.
An event loop in a thread makes it possible for the thread to use certain non-GUI Qt classes that require the presence of an event loop (such as QTimer, QTcpSocket, and QProcess). It also makes it possible to connect signals from any threads to slots of a specific thread. This is explained in more detail in the Signals and Slots Across Threads section below."
Bedeutet dass, das wenn ich Tconnection_thread mit exec() aufrufe und queud connection verwende eine Verbindung von Objekten deren Klassen von QTcpServer abgeleitet sind zu Objekten in anderen Threads doch möglich ist ?
Oder bringe ich da etwas durcheinander ?
2. Wenn ich über eine Signal-Slot-Verbindung, die Objekte in unterschiedlichen Threads verbindet,Daten in Form eines QByteArray Objektes austausche ist dann eine Tiefenkopie (deep copy) erforderlich ?
Was passiert eigentlich mit Objekten , die vor dem Beenden des Threads nicht zerstört wurden ?
Sind nur ihre Ressourcen nicht freigegeben worden und ich kann mit einem Pointer, der auf sie zeigt und den ich zuvor an einen anderen Thread übergeben habe dort mit diesen Objeken weiter arbeiten oder droht ein Absturz ?
Den Artikel über Implicit Sharing habe ich leider nicht verstanden.
3. Ich möchte die Methode (Slot) send(QByteArray data) der Klasse Tconnection mit einem Mutex schützen.
Wo muss ich den Deklarieren ?
Vielen Dank für eure Antworten