Fixed thread sync

This commit is contained in:
2026-01-08 19:05:07 +01:00
parent f19a33cc5f
commit 6b03797600
4 changed files with 28 additions and 32 deletions

View File

@@ -134,7 +134,8 @@ void BCMainWindow::initMainWindow()
connect( this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::onUpdateValue); connect( this, &BCMainWindow::requestValueUpdate, &_transmitter, &BCTransmitter::onUpdateValue);
connect( &_worker, &QThread::finished, &_transmitter, &QObject::deleteLater); connect( &_worker, &QThread::finished, &_transmitter, &QObject::deleteLater);
connect( &_transmitter, &BCTransmitter::driverStateChanged, this, &BCMainWindow::onDriverStateChanged ); connect( &_transmitter, &BCTransmitter::driverStateChanged, this, &BCMainWindow::onDriverStateChanged );
connect( &_transmitter, &BCTransmitter::valueQueueEmpty, this, &BCMainWindow::onValueQueueEmpty ); connect( &_transmitter, &BCTransmitter::endOfProcessing, this, &BCMainWindow::onEndOfProcessing );
connect( this, &BCMainWindow::endOfTransmission, &_transmitter, &BCTransmitter::onEndOfTransmission );
// transmitter starten // transmitter starten
_transmitter.moveToThread(&_worker); _transmitter.moveToThread(&_worker);
@@ -307,7 +308,7 @@ void BCMainWindow::onValueUpdated(BCDevice::ID deviceID, int index, BCValue::Fla
} }
} }
void BCMainWindow::onValueQueueEmpty() void BCMainWindow::onEndOfProcessing()
{ {
qDebug() << " --- END sync"; qDebug() << " --- END sync";
_syncButton->setEnabled( true ); _syncButton->setEnabled( true );
@@ -342,6 +343,8 @@ void BCMainWindow::onSyncDeviceView()
emit requestValueUpdate( value); emit requestValueUpdate( value);
} }
qDebug() << " --- sending FORWARD EOT";
emit endOfTransmission();

View File

@@ -62,7 +62,7 @@ public slots:
// Slots für Rückmeldungen vom Transmitter // Slots für Rückmeldungen vom Transmitter
void onValueUpdated( BCDevice::ID deviceID, int index, BCValue::Flag state, uint32_t rawValue ); void onValueUpdated( BCDevice::ID deviceID, int index, BCValue::Flag state, uint32_t rawValue );
void onValueQueueEmpty(); void onEndOfProcessing();
void onSyncDeviceView(); void onSyncDeviceView();
void onShowMessage( const QString& message, int timeOut=3000); void onShowMessage( const QString& message, int timeOut=3000);
@@ -71,6 +71,7 @@ signals:
// Internes Signal, um Daten an den Worker Thread zu senden // Internes Signal, um Daten an den Worker Thread zu senden
void requestValueUpdate( BCValuePtrConst value); void requestValueUpdate( BCValuePtrConst value);
void endOfTransmission();
protected: protected:

View File

@@ -143,33 +143,16 @@ void BCTransmitter::onUpdateValue( BCValuePtrConst valuePtr)
// Wir benutzen doch eine zusätzliche Queue, um erkennen zu können, ob der // Wir benutzen doch eine zusätzliche Queue, um erkennen zu können, ob der
// der aktuelle Auftragsblock abgearbeit wurde. // der aktuelle Auftragsblock abgearbeit wurde.
_valueQueue.enqueue( valuePtr ); //_valueQueue.enqueue( valuePtr );
//qDebug() << " # #### ENQ: " <<_valueQueue.size(); //qDebug() << " # #### ENQ: " <<_valueQueue.size();
// Wir schicken den event gleich wieder weiter ... // Wir schicken den event gleich wieder weiter ...
QMetaObject::invokeMethod(this, "onProcessValue", Qt::QueuedConnection); //QMetaObject::invokeMethod(this, "onProcessValue", Qt::QueuedConnection);
}
void BCTransmitter::onProcessValue()
{
while (true)
{
BCValuePtrConst valuePtr{};
{
//QMutexLocker locker(&_mutex);
if (_valueQueue.isEmpty())
{
//_isBusy = false;
//qDebug() << " --- XXXXXXXXXX Warum so oft?";
emit valueQueueEmpty();
break; // Schleife verlassen, warten auf neue Events
}
valuePtr =_valueQueue.dequeue();
//qDebug() << " # #### DEQ: " <<_valueQueue.size();
} // Mutex wird hier freigegeben! WICHTIG: Execute ohne Lock!
// Kosmetik
const BCValue& value = *(valuePtr.get()); // Kosmetik
const BCValue& value = *(valuePtr.get());
// Kosmetik // Kosmetik
//const BCValue& value = *(valuePtr.get()); //const BCValue& value = *(valuePtr.get());
@@ -189,7 +172,6 @@ void BCTransmitter::onProcessValue()
if(value.valueFlags.testFlag( BCValue::Flag::WriteMe ) ) if(value.valueFlags.testFlag( BCValue::Flag::WriteMe ) )
{ {
} }
// oder sollen wir hier beides erlauben ? readFlag & writeFlag ? // oder sollen wir hier beides erlauben ? readFlag & writeFlag ?
// Was kommt dann zuerst? Schreiben und lesen als verify ? // Was kommt dann zuerst? Schreiben und lesen als verify ?
@@ -209,11 +191,21 @@ void BCTransmitter::onProcessValue()
// __fix // __fix
//bc::processEventsFor(150); //bc::processEventsFor(150);
bc::delay_millis(150); bc::delay_millis(250);
} // while
} }
/**
* @brief Wenn dieser SLOT in der Event-Queue erreicht wird, dedeutet dies, das die
* Übertrgung vom Mainwindow abgeschlossen wurde. Wir schicken zur Bestätigung das
* Signal 'endOfProcessing' (Welches dann den 'Sync' - Button wieder einschaltet.
*/
void BCTransmitter::onEndOfTransmission()
{
qDebug() << " --- sending BACK EOT";
emit endOfProcessing();
}
TransmitResult BCTransmitter::readByteValue( uint32_t deviceID, uint8_t registerID ) TransmitResult BCTransmitter::readByteValue( uint32_t deviceID, uint8_t registerID )

View File

@@ -36,7 +36,6 @@
#include <QObject> #include <QObject>
#include <QQueue> #include <QQueue>
#include <QMutex> #include <QMutex>
#include <atomic>
#include <bcvalue.h> #include <bcvalue.h>
#include <bcdrivertinycan.h> #include <bcdrivertinycan.h>
@@ -66,10 +65,11 @@ public slots:
void onUpdateValue(BCValuePtrConst valuePtr ); void onUpdateValue(BCValuePtrConst valuePtr );
void onProcessValue(); void onProcessValue();
void onStartNativeDriver(); void onStartNativeDriver();
void onEndOfTransmission();
signals: signals:
void valueQueueEmpty(); void endOfProcessing();
void valueUpdated(BCDevice::ID deviceID, int index, BCValue::Flag state, uint32_t rawValue ); void valueUpdated(BCDevice::ID deviceID, int index, BCValue::Flag state, uint32_t rawValue );
void driverStateChanged( BCDriver::DriverState state, const QString& message="" ); void driverStateChanged( BCDriver::DriverState state, const QString& message="" );
@@ -81,8 +81,8 @@ private:
TransmitResult readByteValue( uint32_t deviceID, uint8_t registerID ); TransmitResult readByteValue( uint32_t deviceID, uint8_t registerID );
TransmitResult readWordValue( uint32_t deviceID, uint8_t registerID ); TransmitResult readWordValue( uint32_t deviceID, uint8_t registerID );
using BCDataQueue = QQueue<BCValuePtrConst>; //using BCDataQueue = QQueue<BCValuePtrConst>;
BCDataQueue _valueQueue; //BCDataQueue _valueQueue;
//QMutex _mutex; //QMutex _mutex;
//std::atomic<bool> _isBusy{ false }; //std::atomic<bool> _isBusy{ false };