mirror of
https://github.com/x-tools-author/x-tools.git
synced 2025-09-15 15:28:40 +08:00
修复删除转发实例时,造成程序崩溃的bug
This commit is contained in:
parent
8569ec65ba
commit
67bda2034e
@ -67,12 +67,12 @@ void SerialPortTransmissionItemWidget::write(QByteArray data)
|
||||
void SerialPortTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
{
|
||||
// c++11 lambda表达式
|
||||
auto closeDev = [&](QSerialPort *dev){
|
||||
if (dev){
|
||||
disconnect(dev, &QSerialPort::readyRead, this, &SerialPortTransmissionItemWidget::read);
|
||||
dev->close();
|
||||
dev->deleteLater();
|
||||
dev = nullptr;
|
||||
auto closeDev = [&](){
|
||||
if (serialPort){
|
||||
disconnect(serialPort, &QSerialPort::readyRead, this, &SerialPortTransmissionItemWidget::read);
|
||||
serialPort->close();
|
||||
serialPort->deleteLater();
|
||||
serialPort = nullptr;
|
||||
this->setUiEnable(true);
|
||||
}
|
||||
};
|
||||
@ -96,11 +96,11 @@ void SerialPortTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
}else{
|
||||
emit requestOutputMessage(serialPort->errorString(), false);
|
||||
enableCheckBox->setChecked(false);
|
||||
closeDev(serialPort);
|
||||
closeDev();
|
||||
}
|
||||
}else{
|
||||
if (serialPort){
|
||||
closeDev(serialPort);
|
||||
closeDev();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,17 +21,27 @@
|
||||
TcpTransmissionItemWidget::TcpTransmissionItemWidget(SAKDebugPage *debugPage, QWidget *parent)
|
||||
:BaseTransmissionItemWidget (debugPage, parent)
|
||||
,ui (new Ui::TcpTransmissionItemWidget)
|
||||
,tcpSocket (nullptr)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
enableCheckBox = ui->enableCheckBox;
|
||||
customAddressCheckBox = ui->customAddressCheckBox;
|
||||
addressComboBox = ui->addressComboBox;
|
||||
portLineEdit = ui->portLineEdit;
|
||||
localAddressComboBox = ui->addressComboBox;
|
||||
localPortLineEdit = ui->portLineEdit;
|
||||
handleReceiveDataCheckBox = ui->handleReceiveDataCheckBox;
|
||||
targetAddressLineEdit = ui->targetAddressLineEdit;
|
||||
targetPortLineEdit = ui->targetPortLineEdit;
|
||||
serverAddressLineEdit = ui->targetAddressLineEdit;
|
||||
serverPortLineEdit = ui->targetPortLineEdit;
|
||||
|
||||
SAKBase::instance()->initIpComboBox(addressComboBox);
|
||||
SAKBase::instance()->initIpComboBox(localAddressComboBox);
|
||||
}
|
||||
|
||||
TcpTransmissionItemWidget::~TcpTransmissionItemWidget()
|
||||
{
|
||||
if (tcpSocket){
|
||||
delete tcpSocket;
|
||||
}
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void TcpTransmissionItemWidget::write(QByteArray data)
|
||||
@ -47,15 +57,15 @@ void TcpTransmissionItemWidget::write(QByteArray data)
|
||||
|
||||
void TcpTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
{
|
||||
auto closeDev = [&](QTcpSocket *dev){
|
||||
if (dev){
|
||||
dev->disconnectFromHost();
|
||||
if (dev->state() == QTcpSocket::ConnectedState){
|
||||
dev->waitForDisconnected();
|
||||
auto closeDev = [&](){
|
||||
if (tcpSocket){
|
||||
tcpSocket->disconnectFromHost();
|
||||
if (tcpSocket->state() == QTcpSocket::ConnectedState){
|
||||
tcpSocket->waitForDisconnected();
|
||||
}
|
||||
disconnect(dev, &QTcpSocket::readyRead, this, &TcpTransmissionItemWidget::read);
|
||||
dev->deleteLater();
|
||||
dev = nullptr;
|
||||
disconnect(tcpSocket, &QTcpSocket::readyRead, this, &TcpTransmissionItemWidget::read);
|
||||
delete tcpSocket;
|
||||
tcpSocket = nullptr;
|
||||
this->setUiEnable(true);
|
||||
}
|
||||
};
|
||||
@ -63,44 +73,50 @@ void TcpTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
if (enableCheckBox->isChecked()){
|
||||
tcpSocket = new QTcpSocket;
|
||||
if (customAddressCheckBox->isChecked()){
|
||||
if (!tcpSocket->bind(QHostAddress(addressComboBox->currentText()), static_cast<quint16>(portLineEdit->text().toInt()))){
|
||||
if (!tcpSocket->bind(QHostAddress(localAddressComboBox->currentText()), static_cast<quint16>(localPortLineEdit->text().toInt()))){
|
||||
emit requestOutputMessage(tr("设备绑定失败:") + tcpSocket->errorString(), false);
|
||||
enableCheckBox->setChecked(false);
|
||||
closeDev(tcpSocket);
|
||||
closeDev();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!tcpSocket->open(QTcpSocket::ReadWrite)){
|
||||
emit requestOutputMessage(tr("设备无法打开:") + tcpSocket->errorString(), false);
|
||||
enableCheckBox->setChecked(false);
|
||||
closeDev(tcpSocket);
|
||||
closeDev();
|
||||
return;
|
||||
}
|
||||
|
||||
connect(tcpSocket, &QTcpSocket::readyRead, this, &TcpTransmissionItemWidget::read);
|
||||
tcpSocket->connectToHost(targetAddressLineEdit->text(), static_cast<quint16>(targetPortLineEdit->text().toInt()));
|
||||
tcpSocket->connectToHost(serverAddressLineEdit->text(), static_cast<quint16>(serverPortLineEdit->text().toInt()));
|
||||
if (!tcpSocket->waitForConnected()){
|
||||
emit requestOutputMessage(tr("无法连接服务器:") + tcpSocket->errorString(), false);
|
||||
enableCheckBox->setChecked(false);
|
||||
closeDev(tcpSocket);
|
||||
closeDev();
|
||||
}else{
|
||||
this->setUiEnable(false);
|
||||
}
|
||||
}else{
|
||||
closeDev(tcpSocket);
|
||||
closeDev();
|
||||
}
|
||||
}
|
||||
|
||||
void TcpTransmissionItemWidget::read()
|
||||
{
|
||||
{
|
||||
if (tcpSocket){
|
||||
QByteArray data = tcpSocket->readAll();
|
||||
emit bytesRead(data);
|
||||
if (handleReceiveDataCheckBox->isChecked()){
|
||||
emit bytesRead(data);;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TcpTransmissionItemWidget::setUiEnable(bool enable)
|
||||
{
|
||||
customAddressCheckBox->setEnabled(enable);
|
||||
addressComboBox->setEnabled(enable);
|
||||
portLineEdit->setEnabled(enable);
|
||||
targetAddressLineEdit->setEnabled(enable);
|
||||
targetPortLineEdit->setEnabled(enable);
|
||||
localAddressComboBox->setEnabled(enable);
|
||||
localPortLineEdit->setEnabled(enable);
|
||||
serverAddressLineEdit->setEnabled(enable);
|
||||
serverPortLineEdit->setEnabled(enable);
|
||||
}
|
||||
|
||||
@ -32,17 +32,18 @@ class TcpTransmissionItemWidget:public BaseTransmissionItemWidget
|
||||
Q_OBJECT
|
||||
public:
|
||||
TcpTransmissionItemWidget(SAKDebugPage *debugPage, QWidget *parent = nullptr);
|
||||
~TcpTransmissionItemWidget();
|
||||
|
||||
virtual void write(QByteArray data);
|
||||
private:
|
||||
Ui::TcpTransmissionItemWidget *ui;
|
||||
QCheckBox *enableCheckBox;
|
||||
QCheckBox *customAddressCheckBox;
|
||||
QComboBox *addressComboBox;
|
||||
QLineEdit *portLineEdit;
|
||||
QComboBox *localAddressComboBox;
|
||||
QLineEdit *localPortLineEdit;
|
||||
QCheckBox *handleReceiveDataCheckBox;
|
||||
QLineEdit *targetAddressLineEdit;
|
||||
QLineEdit *targetPortLineEdit;
|
||||
QLineEdit *serverAddressLineEdit;
|
||||
QLineEdit *serverPortLineEdit;
|
||||
|
||||
QTcpSocket *tcpSocket;
|
||||
private slots:
|
||||
|
||||
@ -17,14 +17,14 @@
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="customAddressCheckBox">
|
||||
<property name="text">
|
||||
<string>指定地址端口</string>
|
||||
<string>指定本地地址端口</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>地址</string>
|
||||
<string>本地地址</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -48,12 +48,16 @@
|
||||
<item row="0" column="4">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>端口</string>
|
||||
<string>本地端口</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="5">
|
||||
<widget class="QLineEdit" name="portLineEdit"/>
|
||||
<widget class="QLineEdit" name="portLineEdit">
|
||||
<property name="text">
|
||||
<string>55555</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="handleReceiveDataCheckBox">
|
||||
@ -68,22 +72,30 @@
|
||||
<item row="1" column="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>目标地址</string>
|
||||
<string>服务器地址</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QLineEdit" name="targetAddressLineEdit"/>
|
||||
<widget class="QLineEdit" name="targetAddressLineEdit">
|
||||
<property name="text">
|
||||
<string>127.0.0.1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>目标端口</string>
|
||||
<string>服务器端口</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QLineEdit" name="targetPortLineEdit"/>
|
||||
<widget class="QLineEdit" name="targetPortLineEdit">
|
||||
<property name="text">
|
||||
<string>44444</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
||||
@ -58,10 +58,10 @@ void UdpTransmissionItemWidget::write(QByteArray data)
|
||||
|
||||
void UdpTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
{
|
||||
auto closeDev = [&](QUdpSocket *dev){
|
||||
disconnect(dev, &QUdpSocket::readyRead, this, &UdpTransmissionItemWidget::read);
|
||||
delete dev;
|
||||
dev = nullptr;
|
||||
auto closeDev = [&](){
|
||||
disconnect(udpSocket, &QUdpSocket::readyRead, this, &UdpTransmissionItemWidget::read);
|
||||
delete udpSocket;
|
||||
udpSocket = nullptr;
|
||||
this->setUiEnable(true);
|
||||
};
|
||||
|
||||
@ -83,7 +83,7 @@ void UdpTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
|
||||
emit requestOutputMessage(udpSocket->errorString(), false);
|
||||
enableCheckBox->setChecked(false);
|
||||
closeDev(udpSocket);
|
||||
closeDev();
|
||||
};
|
||||
|
||||
if (enableCheckBox->isChecked()){
|
||||
@ -94,7 +94,7 @@ void UdpTransmissionItemWidget::on_enableCheckBox_clicked()
|
||||
bindDev(QHostAddress(addressComboBox->currentText()), static_cast<quint16>(portLineEdit->text().toInt()), false);
|
||||
}
|
||||
}else{
|
||||
closeDev(udpSocket);
|
||||
closeDev();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user