Deklarationsteil der Klasse Controller:Wie starte ich Timer aus der Arbeiter-Thread-Klasse in Qt?
class ProtocolPacket: public QQuickItem
{
private:
Q_OBJECT
...
QThread objWorkerThread;
public:
ProtocolPacket();
~ProtocolPacket();
...
Der Konstruktor der Controller-Klasse:
ProtocolPacket::ProtocolPacket()
{
ReadWriteSerialPort *objReadWriteSerialPort = new ReadWriteSerialPort;
objReadWriteSerialPort->moveToThread(&objWorkerThread);
connect(&objWorkerThread, &QThread::finished,
objReadWriteSerialPort, &QObject::deleteLater);
/// Following signals of ProtocolPacket class are connected to the corresponding
/// slots of thread class ReadWriteSerialPort.
connect(this, &ProtocolPacket::cameraValueChanged,
objReadWriteSerialPort, &ReadWriteSerialPort::receiveAndSendUpdatedCameraValue);
...
...
objWorkerThread.start();
}
Der Konstruktor der Worker-Thread-Klasse:
ReadWriteSerialPort::ReadWriteSerialPort()
{
...
serialPort.setPortName ("/dev/ttyUSB0");
serialPort.setBaudRate (QSerialPort::Baud19200);
if(serialPort.open (QIODevice::ReadWrite))
{
serialPort.setDataBits(QSerialPort::Data8);
serialPort.setParity(QSerialPort::NoParity);
serialPort.setStopBits(QSerialPort::OneStop);
}
objWriter = new SerialPortWriter(&serialPort);
objReader = new SerialPortReader(&serialPort);
timerSendVelocityPackets = new QTimer(this);
connect (timerSendVelocityPackets, SIGNAL (timeout()),
this, SLOT (sendVelocityPacket()));
timerSendHealthFeedbackPackets = new QTimer(this);
connect (timerSendHealthFeedbackPackets, SIGNAL (timeout()),
this, SLOT (formAndSendHealthFeedbackPackets()));
timerReceivePackets = new QTimer (this);
connect (timerReceivePackets, SIGNAL (timeout()),
this, SLOT (receiveAndUnpackPacket()));
timerReceivePackets->start (300);
}
Ich bin receivi ng den Fehler:
QObject::startTimer: Timers cannot be started from another thread
Was mache ich falsch?
Ich wünsche den Timer von der Arbeiter-Klasse zu starten: ReadWriteSerialPort
Der Konstruktor von QThread wird im aufrufenden Thread ausgeführt, nicht im Thread, zu dem die QThread-Instanz gehört. Sie müssen also Ihren Timer an anderer Stelle starten, nachdem Sie den Arbeitsthread gestartet haben. –
Bitte erläutern Sie Ihren Kommentar näher und eine Lösung auch in einer Antwort. @KarstenKoop –
Der Kommentar ist falsch. –