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