diff --git a/serialConnectionManager/ModbusMaster.cpp b/serialConnectionManager/ModbusMaster.cpp index cd35629..8d6a774 100644 --- a/serialConnectionManager/ModbusMaster.cpp +++ b/serialConnectionManager/ModbusMaster.cpp @@ -107,7 +107,9 @@ void modBusMaster::setMultipleRegister(int startAddress, quint16 writeSize , QVe QBitArray modBusMaster::getCoil(int startAddress, quint16 readSize) { + qDebug() << " QThread::currentThreadId() getCoil befor" < modBusMaster::getHoldingRegister(int startAddress, quint16 rea QModbusDataUnit modBusMaster::readRequest(QModbusDataUnit::RegisterType registerType, int startAddress, quint16 readSize) { - + qDebug() << " QThread::currentThreadId() readRequest1" <sendReadRequest(QModbusDataUnit(table, startAddress, readSize), _slaveAddress)) { QFuture future = QtConcurrent::run([this, reply]() { + qDebug() << " QThread::currentThreadId() inside worker thread" <isFinished()) // { // qDebug() << "reply->isFinished() " << reply->isFinished(); // qDebug() << "Hello from thread " << QThread::currentThread(); // } - if (!freeThread) + + if (!reply->isFinished()) { - if (!reply->isFinished()) - { - qDebug() << "1reply->isFinished() " << reply->isFinished(); - connect(reply, &QModbusReply::finished, this, &modBusMaster::modbusReplyRecieved, Qt::ConnectionType::BlockingQueuedConnection); - qDebug() << "2reply->isFinished() " << reply->isFinished(); - } + qDebug() << " QThread::currentThreadId() inside worker thread isFinished" <isFinished() " << reply->isFinished(); + connect(reply, &QModbusReply::finished, this, &modBusMaster::modbusReplyRecieved); + qDebug() << "2reply->isFinished() " << reply->isFinished(); } - }); + + + }); + qDebug() << " QThread::currentThreadId() readRequest3" <(sender()); // if (!reply) // return; // modbusReplyFromClient = reply; freeThread=true; + mutex.lock(); + if (freeThread) + modBusAnswerNotReady.wakeAll(); + mutex.unlock(); // reply->deleteLater(); diff --git a/serialConnectionManager/mainwindow.cpp b/serialConnectionManager/mainwindow.cpp index c8725aa..9a5907a 100644 --- a/serialConnectionManager/mainwindow.cpp +++ b/serialConnectionManager/mainwindow.cpp @@ -2,6 +2,7 @@ #include "ui_mainwindow.h" #include "qdebug.h" #include +#include "QtConcurrent/QtConcurrent" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) @@ -11,13 +12,21 @@ MainWindow::MainWindow(QWidget *parent) ui->writeTable->addItem(tr("Discrete Inputs"), 1); ui->writeTable->addItem(tr("Input Registers"), 2); ui->writeTable->addItem(tr("Holding Registers"), 3); - connect(&modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState); + modBusObj = new modBusMaster(); + modBusObj->moveToThread(&workerThread); + workerThread.setObjectName("workerThread"); + workerThread.start(); + // the thread starts the event loop and blocks waiting for events + connect(modBusObj, &modBusMaster::modbusConnectionState, this, &MainWindow::connectionState); + } MainWindow::~MainWindow() { delete ui; + workerThread.quit(); + workerThread.wait(); } @@ -25,12 +34,12 @@ void MainWindow::on_connectButton_clicked() { if( ui->connectButton->text()==tr("Disconnect")) { - modBusObj.stop(); + modBusObj->stop(); } else { - modBusObj.init(); - modBusObj.open(ui->portEdit->text(),ui->serverEdit->value()); + modBusObj->init(); + modBusObj->open(ui->portEdit->text(),ui->serverEdit->value()); } @@ -42,13 +51,13 @@ void MainWindow::on_readButton_clicked() // do not go beyond 10 entries int numberOfEntries = qMin(ui->readSize->currentText().toInt(), 10 - startAddress); switch (ui->writeTable->currentData().toInt()) { - case 0: printCoilsDataFromSlave(modBusObj.getCoil(startAddress,static_cast(numberOfEntries))); + case 0: printCoilsDataFromSlave(modBusObj->getCoil(startAddress,static_cast(numberOfEntries))); break; - case 1: printCoilsDataFromSlave(modBusObj.getInputCoil(startAddress,static_cast(numberOfEntries))); + case 1: printCoilsDataFromSlave(modBusObj->getInputCoil(startAddress,static_cast(numberOfEntries))); break; - case 2: printRegisterDataFromSlave(modBusObj.getInputRegister(startAddress,static_cast(numberOfEntries))); + case 2: printRegisterDataFromSlave(modBusObj->getInputRegister(startAddress,static_cast(numberOfEntries))); break; - case 3: printRegisterDataFromSlave(modBusObj.getHoldingRegister(startAddress,static_cast(numberOfEntries))); + case 3: printRegisterDataFromSlave(modBusObj->getHoldingRegister(startAddress,static_cast(numberOfEntries))); break; } @@ -97,11 +106,11 @@ void MainWindow::on_writeButton_clicked() { uiCoils.setBit(0,ui->coilData1->isChecked()); uiCoils.setBit(1,ui->coilData2->isChecked()); - modBusObj.setMultipleCoil(startAddress, numberOfEntries, uiCoils); + modBusObj->setMultipleCoil(startAddress, numberOfEntries, uiCoils); } else if (numberOfEntries==1) { - modBusObj.setSingleCoil(startAddress, ui->coilData1->isChecked()); + modBusObj->setSingleCoil(startAddress, ui->coilData1->isChecked()); } break; @@ -110,11 +119,11 @@ void MainWindow::on_writeButton_clicked() { uiholdingRegisters[0]=ui->textEdit1->toPlainText().toUInt(); uiholdingRegisters[1]=ui->textEdit2->toPlainText().toUInt(); - modBusObj.setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters); + modBusObj->setMultipleRegister(startAddress, numberOfEntries, uiholdingRegisters); } else if (numberOfEntries==1) { - modBusObj.setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt()); + modBusObj->setSingleRegister(startAddress, ui->textEdit1->toPlainText().toUInt()); } break; } diff --git a/serialConnectionManager/mainwindow.h b/serialConnectionManager/mainwindow.h index ba69b41..1e9cce9 100644 --- a/serialConnectionManager/mainwindow.h +++ b/serialConnectionManager/mainwindow.h @@ -1,6 +1,6 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H - +#include #include #include "ModbusMaster.h" QT_BEGIN_NAMESPACE @@ -26,8 +26,9 @@ private slots: private: Ui::MainWindow *ui; - modBusMaster modBusObj; + modBusMaster *modBusObj; QBitArray uiCoils; QVector uiholdingRegisters; + QThread workerThread; }; #endif // MAINWINDOW_H