QProcess и его закрытие
Код срр файла:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this);
connect(ui -> choose_file, &QPushButton::released, this, &Widget::slot_openfile);
connect(ui -> speeds, &QComboBox::currentTextChanged, this, &Widget::slot_speed);
connect(ui -> l_filename, &QLineEdit::textChanged, this, &Widget::slot_enter);
connect(ui -> send_file, &QPushButton::released, this, &Widget::slot_sendfile);
timer = new QTimer();
connect(timer, &QTimer::timeout, this, &Widget::slot_timer);
timer -> start(1000); // 1 sec
com = new QProcess(this);
send = new QProcess(this);
get = new QProcess(this);
com -> start("COM.exe");
com -> waitForFinished(-1);
qDebug() << "get comport";
get -> start("RX.exe");
qDebug() << "wait get";
slot_getcom();
}
void Widget::slot_sendfile() {
get -> kill();
get -> terminate();
get -> waitForFinished(-1);
qDebug() << "stop waiting";
qDebug () << get -> state();
qDebug() << ui -> l_filename -> text();
QString fileName = "send.txt";
if (!fileName.isEmpty()) {
QFile f(fileName);
f.open(QIODevice::WriteOnly | QFile::Truncate);
QTextStream stream(&f);
stream.setAutoDetectUnicode(true);
stream << ui -> l_filename -> text();
qDebug() << "sendfile";
f.close();
}
close();
ui -> standby -> setText("Отправка файла...");
sended = true;
send -> start("TX.exe");
qDebug() << "sending file";
qDebug() << send -> state();
send -> waitForFinished(-1);
qDebug() << "file sended";
get -> start("RX.exe");
qDebug() << "again waiting";
qDebug() << get -> state();
}
void Widget::slot_timer() {
QString fileName = "get.txt";
if (QFileInfo("get.txt").exists()) {
QFile f(fileName);
f.open(QIODevice::ReadOnly);
QTextStream stream(&f);
stream.setAutoDetectUnicode(true);
QString s = "", res;
bool ok = true;
while (stream.readLineInto(&s)) {
if (stream.status() != QTextStream::Ok) {
QMessageBox MessageBox;
MessageBox.setWindowTitle("Ошибка чтения файла");
MessageBox.setText("Ошибка во время чтения файла!");
MessageBox.setInformativeText("Возможно файл недоступен для чтения или повреждён");
MessageBox.setIcon(QMessageBox::Warning);
MessageBox.exec();
ok = false;
break;
}
if (s != "") res = s;
}
f.close();
if (ok) {
QFileInfo fileInfo(s);
ui -> standby -> setText("Успешно получен файл: " + fileInfo.fileName());
}
QFile fg("get.txt");
fg.remove();
get -> start("RX.exe");
qDebug() << "third waiting";
}
if (!QFileInfo("send.txt").exists() & sended) {
ui -> standby -> setText("Успешно отправлен файл: " + QFileInfo(ui -> l_filename -> text()).fileName());
sended = false;
}
}
void Widget::slot_getcom() {
QFile f("com.txt");
f.open(QIODevice::ReadOnly);
QTextStream stream(&f);
stream.setAutoDetectUnicode(true);
QString s = "", res;
bool ok = true;
while (stream.readLineInto(&s)) {
if (stream.status() != QTextStream::Ok) {
QMessageBox MessageBox;
MessageBox.setWindowTitle("Ошибка чтения файла");
MessageBox.setText("Ошибка во время чтения файла!");
MessageBox.setInformativeText("Возможно файл недоступен для чтения или повреждён");
MessageBox.setIcon(QMessageBox::Warning);
MessageBox.exec();
ok = false;
break;
}
if (s != "") res = s;
}
f.close();
if (ok) {
ui -> comp -> setText("COM-порт: " + res);
}
}
void Widget::slot_openfile() {
QString dir = QDir::homePath();
QString filter = "All Files (*.*)";
QString fileName = QFileDialog::getOpenFileName(this, "Открыть файл", dir, filter, &filter);
fileName.replace("/", "\\");
qDebug() << fileName;
ui -> l_filename -> setText(fileName);
qDebug() << "Write in lineEdit";
slot_time();
}
void Widget::slot_time() {
QFileInfo fileInfo(ui -> l_filename -> text());
if (fileInfo.exists()) {
int secs = fileInfo.size() * 8 / speed;
QString s = QString("Примерное время передачи составит: %1 секунд").arg(secs);
ui -> info_label -> setText(s);
} else {
ui -> info_label -> setText("Примерное время передачи составит:");
}
}
void Widget::slot_speed() {
speed = ui -> speeds -> currentText().toInt();
QString fileName = "speed.txt";
if (!fileName.isEmpty()) {
QFile f(fileName);
f.open(QIODevice::WriteOnly | QFile::Truncate);
QTextStream stream(&f);
stream.setAutoDetectUnicode(true);
stream << ui -> speeds -> currentText();
f.close();
}
slot_time();
}
void Widget::slot_enter() {
QFileInfo fileInfo(ui -> l_filename -> text());
if (fileInfo.exists()) {
slot_time();
} else {
ui -> info_label -> setText("Примерное время передачи составит:");
}
}
Widget::~Widget() {
delete ui;
get -> kill();
get -> terminate();
get -> waitForFinished(-1);
qDebug() << "stop";
qDebug () << get -> state();
}
Суть проблемы: При запуске программы почему-то запускается два файла RX.exe, соответственно при закрытии процесса "get", закрывается только один RX.exe, второй продолжает работать и из-за этого не работает файл TX.exe
Почему запускается два RX.exe и как сделать так, чтобы запускался только 1?
Вот эти два процесса в диспетчере задач:
При закрытии программы закрывается тот процесс, который меньше весит, следующий запуск программы второй процесс не создаёт, ровно как и не закрывает оставшийся.
Источник: Stack Overflow на русском