Qt Thread
-
Also in dem einen habe ich keine weiteren connects. Mit dem OpenClose aber anscheinend wird wenn ich OpenClose aus dem Mainthread aufrufe implizit ein neuer Thread gestartet. Entnehmen tue ich das der Prozessanzeige im OS.
Zu dem anderen, wo die Bytes mehrmals kommen da dachte ich halt, ich habe vom Grundaufbau was falsch gemacht.
-
Also irgendwas kommt da mit den Threads durcheinander. Ich habe das ganze jetzt mal reduziert auf:
class SerialThread : public QThread { Q_OBJECT public: void run(){ qDebug() << this->thread() << QThread::currentThread(); } };
Da ist die Ausgabe: QThread(0x109f70) SerialThread(0x15dfa0)
Und ohne Q_OBJECT:
QThread(0x109f70) QThread(0x15e1c0)Und wenn ich über ein SIGNAL aus dem Hauptthread was mit einem SLOT im THREAD mache, wird das dann überhaupt im SerialThread gemacht, oder im MainThread?
-
Jan++ schrieb:
Also in dem einen habe ich keine weiteren connects. Mit dem OpenClose aber anscheinend wird wenn ich OpenClose aus dem Mainthread aufrufe implizit ein neuer Thread gestartet. Entnehmen tue ich das der Prozessanzeige im OS.
Das wäre mir neu dass ein neuer Thread als neuer Prozess angezeigt werden würde.
Das ist dann vllt. die interne Arbeitsweise des QExtSerialPort.
-
Jan++ schrieb:
Und wenn ich über ein SIGNAL aus dem Hauptthread was mit einem SLOT im THREAD mache, wird das dann überhaupt im SerialThread gemacht, oder im MainThread?
Gib mal noch qApp->thread() mit aus, das ist dein mainthread.
Du kannst das gleiche natürlich auch noch in dem SLOT ausgeben, den du connectest.
Du kannst auch mal den SerialThread verschieben, im Konstruktor.SerialThread::SerialThread() { this->moveToThread(this); }
Denn prinzipiell liegen Objekte (QObject) in dem Thread in dem sie instanziiert wurden. Mit moveToThread() kannst du sie verschieben.
-
Nein nicht neuer Prozess. Aber bei jedem Prozess stehen die Threads angegeben.
-
ohne Q_OBJECT:
QThread(0x109f70) QThread(0x15e0a0) QThread(0x109f70)mit:
SerialThread.h:13: error: 'qApp' was not declared in this scope
-
Jan++ schrieb:
mit:
SerialThread.h:13: error: 'qApp' was not declared in this scopeDu hast aber schon QApplication eingebunden (#include)?
-
So also die Dopplungen beim empfang sind jetzt weg durch:
this->moveToThread(this);
im Konstruktor. Was bewirkt das genau? Mein Konstruktor besteht ja nur aus:SerialThread(QString name) { this->moveToThread(this); portName=name; }
-
Das include hatte ich tatsächlich vergessen, in der Version:
also mit Q_OBJECT:
QThread(0x109f80) SerialThread(0x15fab0) QThread(0x109f80)ohne:
QThread(0x109f80) QThread(0x15dff0) QThread(0x109f80)
-
Und in der Abwandlung:
class SerialThread : public QThread { Q_OBJECT public: SerialThread(){ this->moveToThread(this); } void run(){ qDebug() << this->thread() << QThread::currentThread()<<qApp->thread(); } };
mit Q_OBJECT
SerialThread(0x15e170) SerialThread(0x15e170) QThread(0x109f80)ohne:
QThread(0x15e120) QThread(0x15e120) QThread(0x109f80)