QProcess и его закрытие

Рейтинг: 0Ответов: 0Опубликовано: 18.07.2025

Код срр файла:

#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?

Вот эти два процесса в диспетчере задач: введите сюда описание изображения

При закрытии программы закрывается тот процесс, который меньше весит, следующий запуск программы второй процесс не создаёт, ровно как и не закрывает оставшийся.

Ответы

Ответов пока нет.