c++ - QTcpSocket 失效
问题描述
我正在尝试编写一个使用 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
类中的大多数公共函数只是使用不同的参数调用 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 套接字并打开它。在此之后,我多次从类中调用一些公共函数。以下是提到的功能:
<!-- 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());
}
问题是在几个函数调用后socket变得无效。变量 x1 变为假。如果我尝试执行 isWritable() 或 write(),则会发生分段错误。我究竟做错了什么?
更新:我想出了问题所在。我将生成器对象传递给一个没有引用的函数,并从这个函数初始化了连接。所以当函数执行时,对象的副本刚刚被删除,socket也随之被删除。然后我尝试使用初始生成器对象发送命令,当然,它不包含任何套接字。所以这一切完全是我的错。
解决方案
推荐阅读
- angular - 我如何打开(matdaterangepicker-calendar 以及一些按钮,输入文本)-这是一个通过单击其他组件中的按钮的组件?
- c - 在 C 中使用信号量来保护 for 循环中的变量
- amazon-web-services - API Gateway:REST APIs和HTTP APIs在同一个域名上的混合只能通过API Gateway的V2 DomainName接口错误来完成
- svelte - 当我使用自定义域在 Google Cloud Run 中实现一个 sveltekit 项目时加载资源失败
- python - 在 python 3.9.1 中打开 jupyter notebook 时出错
- java - 如何更正 Spring Boot 单元测试无法在两个几乎相同的测试类之一中加载应用程序上下文?
- javascript - 在声明时有条件地将对象添加到数组
- git - Git 拉取和覆盖
- laravel - Laravel Graphl 和搜索过滤器问题(Algolia)
- python - PyCairo 在图像上绘制蒙版