QTcpSocket становится недействительным - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь написать класс для связи с микроволновым генератором с помощью SCPI. Вот его заголовочный файл:

<!-- language: c++ -->
#ifndef GENERATOR_H
#define GENERATOR_H

#include <QTcpSocket>

class generator
{
public:
    generator(QString IP_port, unsigned int scpitimeout);
   ~generator();

    bool connectToGen();
    bool resetgen();
    QString getIDN();
    bool setFreq(double freq);
    bool setPow(double pow);
    bool ALCoff();
    bool setPW(double pw);
    bool setPRI(double pri);
    bool activatePmod();
    bool activateRFpow();
    bool deactivateRFpow();
    QString getlasterror();

private:
    QString genIP;
    QString IDstring;
    QString lasterror;
    unsigned int genPort;
    unsigned int timeout;

    // TCP/IP socket
    QTcpSocket *socket = nullptr;

    bool sendCommand(QString command);
    QString sendQuery(QString query);
};

#endif // GENERATOR_H

Большинство публикуемых c функций в классе просто вызывают sendCommand () или sendQuery () с разными параметрами. Например:

<!-- language: c++ -->
bool generator::activatePmod()
{
    if ( sendCommand(":PULM:STAT ON;\n") )
        return true;
    lasterror = "Some error text here.";
    return false;
}

QString generator::getIDN()
{
    return sendQuery("*IDN?;\n");
}

Я работаю с этим классом следующим образом. Я вызываю конструктор класса из другой функции, создавая объект класса. Затем я вызываю функцию connectToGen (). Создает TCP / IP-сокет и открывает его. После этого я несколько раз вызываю некоторые функции publi c из класса. Вот упомянутые функции:

<!-- language: c++ -->
generator::generator(QString IP_port, unsigned int scpitimeout)
{
    QStringList ipportlist = IP_port.split(QRegExp("(:)"));
    genIP = ipportlist.at(0);
    genPort = ipportlist.at(1).toUInt();
    timeout = scpitimeout;
}

bool generator::connectToGen()
{
    socket = new QTcpSocket(NULL);
    socket->connectToHost(genIP,genPort);
    if (!socket->waitForConnected(timeout)) {
        lasterror = "Some error.";
        return false;
}

bool generator::sendCommand(QString command)
{
    bool x1 = socket->isValid();
    bool x2 = socket->isWritable();
    socket->write(command.toLocal8Bit());
    if (!socket->waitForBytesWritten(timeout))
        return "";
    if (sendQuery("*OPC?;\n").toInt() != 1)
        return false;
   return true;
}

QString generator::sendQuery(QString query)
{
    socket->write(query.toLocal8Bit());
    if (!socket->waitForBytesWritten(timeout))
        return "";
    if (!socket->waitForReadyRead(timeout))
        return "";
   return QString(socket->readAll());
}

Проблема в том, что после нескольких вызовов функций сокет становится недействительным. Переменная x1 становится ложной. Если я попытаюсь выполнить isWritable () или write (), произойдет ошибка сегментации. Что я делаю не так?

ОБНОВЛЕНИЕ: Я понял, в чем проблема. Я передал объект-генератор в функцию без ссылки и инициализировал соединение из этой функции. Итак, когда функция была выполнена, копия объекта была просто удалена, а сокет был удален вместе с ней. Затем я попытался отправить команду с помощью исходного объекта-генератора, который, естественно, не содержал никаких сокетов. Так что все это полностью моя вина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...