QTcpSocket Disconencted () Сигнал не испускается - PullRequest
0 голосов
/ 13 октября 2018

Кажется, что мой код работает нормально! {(QObject: Невозможно создать дочерние элементы для родительского объекта, находящегося в другом потоке: родительский поток: QThread (0x221f650), текущий поток: QThread (0x23a7950): эта ошибка была устранена}

Но , когда я отключаю ЛВС, сигнал отключен () Сигнал не излучается, следовательно, Таймер переподключения не запускается, и, следовательно, мой код останавливается! Я пытался создать свой код таким образом, чтобы, даже если соединение с устройством не было доступно, ** Таймер переподключения ** запускался после каждого 10 секунд , который по таймауту будет подключен к слоту when_ReconnectionTimer_timeout () , попробуйте снова и снова, пока не подключитесь! Но кажется, что отключенный сигнал не работает!

#include "fduprocess.h"
#include<QDebug>
#include<QThread>
fduprocess::fduprocess(QObject *parent) : QObject(parent)
{
}

void fduprocess::timerEvent(QTimerEvent *event)
{
    if(event->timerId()== _iStatusPollTimer)
    {
        if(_ClientSocketInstance.state() == QAbstractSocket::ConnectedState)
        {
            _ClientSocketInstance.write("alarmstat\r\n"); //25
            _ClientSocketInstance.write("selectedin\r\n"); // 4
            _ClientSocketInstance.write("sigoutstat\r\n"); //13
            _ClientSocketInstance.write("disablestat\r\n"); //5    
            _ClientSocketInstance.write("pwrstat\r\n"); //5    
            _ClientSocketInstance.write("siginstat\r\n");//5    
        }
    }
}

void fduprocess::tryit()
{
    qDebug()<< "...came inside tryit to tryit.........";
    connect(&_ReconnectionTimerInstance,SIGNAL(timeout()), this, SLOT(when_ReconnectionTimer_timeout()));
    qDebug()<<"process thread"<< QThread::currentThreadId();
    qDebug()<< "...conencted to whentimeout.........";
    connect(&_ClientSocketInstance,SIGNAL(connected()), this, SLOT(when_ClientSocketInstance_connected()));
    connect(&_ClientSocketInstance,SIGNAL(disconnected()), this, SLOT(when_ClientSocketInstance_disconnected()));
    connect(&_ClientSocketInstance,SIGNAL(readyRead()), this, SLOT(when_ClientSocketInstance_readyRead()));
    connect(&_ClientSocketInstance,SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(when_ClientSocketInstance_error(QAbstractSocket::SocketError)));
    _strIPAddress = "192.168.1.135";
    _usiPort = 23;
    qDebug()<< "...end tryit........";
    _ReconnectionTimerInstance.setSingleShot(true);
    _ReconnectionTimerInstance.setInterval(10000);
    _ReconnectionTimerInstance.start();
    _iStatusPollTimer= startTimer(2000);    
}

void fduprocess::when_ReconnectionTimer_timeout()
{
    qDebug()<<"Reconnecting..";
    // qDebug()<< _ClientSocketInstance.children();
    _ClientSocketInstance.connectToHost(_strIPAddress, _usiPort);
    qDebug()<<"tryin gto reconect..";
}

void fduprocess::when_ClientSocketInstance_connected()
{ 
    qDebug()<<"Connected......";        
    _ClientSocketInstance.write("endrun_1");
    _ClientSocketInstance.flush();
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.write("\n");
    _ClientSocketInstance.flush();   
}

void fduprocess::when_ClientSocketInstance_disconnected()
{
    qDebug()<<"Disconnected";
    _ReconnectionTimerInstance.start();
}

void fduprocess::when_ClientSocketInstance_readyRead()
{
    QByteArray get = _ClientSocketInstance.readLine();
    qDebug() << "getting "<<get ;
}

здесь fduprocess.h

#ifndef FDUPROCESS_H
#define FDUPROCESS_H
#include"fdu.h"
#include <QObject>
#include<QTimer>
#include<QTimerEvent>
#include<QTcpSocket>

class fduprocess : public QObject
{
    Q_OBJECT
    QString                 _strIPAddress;
    quint16                 _usiPort;
    public:
    explicit fduprocess(QObject *parent = 0);
    QTcpSocket              _ClientSocketInstance;
    QTimer               _ReconnectionTimerInstance ;
   int                     _iStatusPollTimer;
     void timerEvent(QTimerEvent *event);
   signals:
   public slots:
    void tryit();
    void doOntimeout();
    void when_ReconnectionTimer_timeout();
    void when_ClientSocketInstance_connected();
    void when_ClientSocketInstance_disconnected();
    void when_ClientSocketInstance_readyRead();
    void when_ClientSocketInstance_error(QAbstractSocket::SocketError error);
};

#endif // FDUPROCESS_H

здесь fdu.cpp

#include "fdu.h"
#include "ui_fdu.h"
#include"fduprocess.h"
fdu::fdu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::fdu)
{
    ui->setupUi(this);
    QThread *workerThread =  new QThread;
    fduprocess *worker = new fduprocess;

 qDebug()<< "...goind to fduprocess........";

//    worker->_ReconnectionTimerInstance = setSingleShot(true);
//    worker->_ReconnectionTimerInstance.start(1000);
//    worker->_iStatusPollTimer = startTimer(500);
    worker->moveToThread(workerThread);
    worker->_ClientSocketInstance.moveToThread(workerThread);
    worker->_ReconnectionTimerInstance.moveToThread(workerThread);
    connect(workerThread,SIGNAL(started()),worker,SLOT(tryit()));
    connect(workerThread,SIGNAL(finished()),worker,SLOT(deleteLater()));
     workerThread->start();
    qDebug()<<"fdu thread "<<QThread::currentThreadId();

}

fdu::~fdu()
{
    delete ui;
}

и main.cpp

#include "fdu.h"
#include <QApplication>
#include<QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    fdu w;
    w.show();
  qDebug()<<"main thrad" <<QThread::currentThreadId();
    return a.exec();
}

Может кто-нибудь, где я совершаю ошибку ??

Пожалуйста, игнорируйте мои соглашения об именах и отступы, так как я нахожусь в моей кривой обучения

1 Ответ

0 голосов
/ 13 октября 2018

Решено!Кажется, меня смутили некоторые понятия!Государство соединялось так, оно не должно было отключаться!

_ClientSocketInstance.disconnectFromHost();
    _ReconnectionTimerInstance.start();

внутри when_ClientSocketInstance_error(QAbstractSocket::SocketError error)

ЭТО сделало бы то, что я хотел.Извините за ошибки все из-за моих запутанных концепций.Спасибо за ваше терпение!

...