Browse Source

multithread 14000727-1

master
nasi 3 years ago
parent
commit
1d5e0b669d
  1. 61
      serialConnectionManager/ModbusMaster.cpp
  2. 6
      serialConnectionManager/ModbusMaster.h

61
serialConnectionManager/ModbusMaster.cpp

@ -110,7 +110,7 @@ QBitArray modBusMaster::getCoil(int startAddress, quint16 readSize)
QModbusDataUnit unit = readRequest(QModbusDataUnit::RegisterType::Coils, startAddress, readSize); QModbusDataUnit unit = readRequest(QModbusDataUnit::RegisterType::Coils, startAddress, readSize);
mutex.lock(); mutex.lock();
if(!freeThread) if(!freeThread)
modBusAnswerNotReady.wait(&mutex); modBusAnswerNotReady.wait(&mutex);
mutex.unlock(); mutex.unlock();
@ -186,30 +186,35 @@ QModbusDataUnit modBusMaster::readRequest(QModbusDataUnit::RegisterType registe
if (auto *reply =modbusDevice->sendReadRequest(QModbusDataUnit(table, startAddress, readSize), _slaveAddress)) if (auto *reply =modbusDevice->sendReadRequest(QModbusDataUnit(table, startAddress, readSize), _slaveAddress))
{ {
QFuture<void> future = QtConcurrent::run([this, reply]() { QFuture<void> future = QtConcurrent::run([this, reply]() {
// while(!reply->isFinished())
// {
// qDebug() << "reply->isFinished() " << reply->isFinished();
// qDebug() << "Hello from thread " << QThread::currentThread();
// }
if (!freeThread)
// qDebug() << "reply->isFinished() " << reply->isFinished();
while(!reply->isFinished())
{
qDebug() << "reply->isFinished() " << reply->isFinished();
qDebug() << "Hello from thread " << QThread::currentThread();
}
freeThread=true;
mutex.lock();
if (freeThread)
modBusAnswerNotReady.wakeAll();
mutex.unlock();
if(!checkForError(reply))
{ {
const QModbusDataUnit unit = reply->result(); if (!reply->isFinished())
return unit; {
qDebug() << "1reply->isFinished() " << reply->isFinished();
connect(reply, &QModbusReply::finished, this, &modBusMaster::modbusReplyRecieved, Qt::ConnectionType::BlockingQueuedConnection);
qDebug() << "2reply->isFinished() " << reply->isFinished();
}
} }
});
// freeThread=true;
mutex.lock();
if (freeThread)
modBusAnswerNotReady.wakeAll();
mutex.unlock();
if(!checkForError(reply))
{
const QModbusDataUnit unit = reply->result();
return unit;
}
});
} }
else else
@ -218,7 +223,7 @@ QModbusDataUnit modBusMaster::readRequest(QModbusDataUnit::RegisterType registe
} }
//reply->deleteLater(); reply->deleteLater();
} }
bool modBusMaster::checkForError(QModbusReply *_reply) bool modBusMaster::checkForError(QModbusReply *_reply)
{ {
@ -239,6 +244,20 @@ bool modBusMaster::checkForError(QModbusReply *_reply)
} }
void modBusMaster::modbusReplyRecieved()
{
// auto reply = qobject_cast<QModbusReply *>(sender());
// if (!reply)
// return;
// modbusReplyFromClient = reply;
freeThread=true;
// reply->deleteLater();
}
void modBusMaster::writeRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 writeSize) void modBusMaster::writeRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 writeSize)
{ {
qDebug() << " ---- setSingleCoil coilFlag writeRequest "; qDebug() << " ---- setSingleCoil coilFlag writeRequest ";

6
serialConnectionManager/ModbusMaster.h

@ -45,9 +45,12 @@ public:
signals: signals:
void dataFromClient(QString readedParameter); void dataFromClient(QString readedParameter);
void modbusConnectionState(bool state); void modbusConnectionState(bool state);
private slots:
void modbusReplyRecieved();
private: private:
QModbusReply *lastRequest; QModbusReply *modbusReplyFromClient;
// QModbusDataUnit modbusReplyUnit;
QModbusClient *modbusDevice = nullptr; QModbusClient *modbusDevice = nullptr;
QString _serialPort ; QString _serialPort ;
int _slaveAddress; int _slaveAddress;
@ -57,6 +60,7 @@ private:
QWaitCondition modBusAnswerNotReady; QWaitCondition modBusAnswerNotReady;
QMutex mutex; QMutex mutex;
bool freeThread=false; bool freeThread=false;
public: public:
QModbusReply *reply; QModbusReply *reply;
}; };

Loading…
Cancel
Save