(Re)-Init Funktion mit QThread-Liste
Verfasst: 9. Juli 2015 14:15
Hallo,
habe da einen Schnipsel der funktioniert wie er soll, aber ich befürchte, dass es ziemlich unsauber ist.
Eine Klasse dient zur Steuerung und Überwachung mehrerer Worker-Objekte. Das läuft über Listen, d.h die Worker-Objekte werden in einer Liste abgelegt. Analog werden QThreads für jedes Worker-Objekt erzeugt, wo das Worker-Objekt reingesteckt wird, ebenfalls in einer Liste gesammelt. Das übernimmt eine Init-Funktion, die ich gerne auch zum Reinit einsetzen wollte, d.h. die sollte mehrmals nacheinander aufgerufen werden können.
Die zwei Listen sind die einzige Referenz zu den QThreads und den aufgenommenen Worker-Objekten.
Ich denke der Verlauf ist soweit klar und auch worin ich das Problem sehe. Die clear()-Funktion von QList wird sicherlich nicht die Worker-Objekte und QThreads löschen. Es funktioniert zwar soweit, aber ich brauche wohl unbedingt einen Rat, denn wie eine passable Lösung sieht mir das nicht aus. Falls noch Fehler im Code drin sind: den habe ich gerade nur so runtergetippt, damit wir hier ein Bild haben.
Es darf davon ausgegangen werden, dass bei allen Worker-Objekten ein Bereitschafts-Status vorliegt, d.h. in den QThreads nichts mehr läuft, sowie die Zeiger aus den Listen entfernt werden.
Die Init-Funktion eines Worker-Objekts wird aufgerufen sobald der zugehörige QThread gestartet wurde. Da passiert nicht mehr viel.
So lässt sich dann in der Worker-Klasse auch mit dem _port-Member reibungslos arbeiten. Bereitschaft eines Workers heißt auch, dass der Port geschlossen ist.
Ich habe noch nicht einmal geschaut, ob vielleicht der Destruktor der Worker-Klasse beim Entfernen des Zeigers aus der Liste aufgerufen wird.
Vielen Dank.
Grüße,
leif
habe da einen Schnipsel der funktioniert wie er soll, aber ich befürchte, dass es ziemlich unsauber ist.
Eine Klasse dient zur Steuerung und Überwachung mehrerer Worker-Objekte. Das läuft über Listen, d.h die Worker-Objekte werden in einer Liste abgelegt. Analog werden QThreads für jedes Worker-Objekt erzeugt, wo das Worker-Objekt reingesteckt wird, ebenfalls in einer Liste gesammelt. Das übernimmt eine Init-Funktion, die ich gerne auch zum Reinit einsetzen wollte, d.h. die sollte mehrmals nacheinander aufgerufen werden können.
Code: Alles auswählen
QList<QThread *> _workerThreads;
QList<Worker *> _workers;
Code: Alles auswählen
void Operator::init()
{
// ist clear gleich clean? ...wohl kaum.
_workerThreads.clear();
_workers.clear();
int numberOfPorts = QSerialPortInfo::availablePorts().length();
for(int i = 0; i < numberOfPorts; i++)
{
_workerThreads.append(new QThread);
_workers.append(new Worker);
_workers.last()->moveToThread(_workerThreads.last());
connect(_workerThreads.last(), SIGNAL(started()), _workers.last(), SLOT(init()));
}
for(int i = 0; i < workerThreads.length(); i++)
{
_workerThreads.at(i)->start();
}
}
Es darf davon ausgegangen werden, dass bei allen Worker-Objekten ein Bereitschafts-Status vorliegt, d.h. in den QThreads nichts mehr läuft, sowie die Zeiger aus den Listen entfernt werden.
Die Init-Funktion eines Worker-Objekts wird aufgerufen sobald der zugehörige QThread gestartet wurde. Da passiert nicht mehr viel.
Code: Alles auswählen
void Worker::init()
{
_port = new QSerialPort;
}
Ich habe noch nicht einmal geschaut, ob vielleicht der Destruktor der Worker-Klasse beim Entfernen des Zeigers aus der Liste aufgerufen wird.
Vielen Dank.
Grüße,
leif