GUI зависает при использовании QProcess во время сбора данных

ОПРЕДЕЛЕНИЕ ПРОБЛЕМЫ : у меня есть внешнее приложение под названием runSensor, которое связывается с датчиком. Датчик отправляет свои данные по UDP. Используя терминал, runSensor имеет два аргумента для связи с датчиком для сбора данных: start а также stop,

Однажды в терминале я звоню: $ runSensor start Пример вывода выглядит следующим образом:

[Time 07:20:11:000]: Device PoweredOn.
[Time 07:20:11:010]: x=1.231, y=-0.022, z=0.001
[Time 07:20:11:015]: x=1.235, y=-0.024, z=0.001
[Time 07:20:11:020]: x=1.241, y=-0.024, z=0.002
[Time 07:20:11:025]: x=1.258, y=-0.027, z=0.002

Мне нужно позвонить start а также stop используя QT -UI. Для этого у меня есть QDialog следующим образом:

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
    ui->setupUi(this);
    this->socketHandler         = std::make_shared<udpHandler>();
    this->runSensorStartProcess = std::make_shared<QProcess>();
    this->runSensorStopProcess  = std::make_shared<QProcess> ();

    //--------------------------
    // SIGNAL - SLOT
    //--------------------------
    connect(ui->startButton, SIGNAL(clicked()), this,  SLOT(onStartButtonClicked()));
    connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(onStopButtonClicked()));
    connect(this->socketHandler.get(), SIGNAL(sendUdpContent(QString)), this, SLOT(updateMessageBrowser(QString)));
    connect(this->runSensorStartProcess.get(), SIGNAL(readyReadStandardError()), this, SLOT(printError()));
}

я использую QProcess вызвать запуск и останов приложения runSensor. Когда я нажимаю кнопку запуска графического интерфейса, начинается сбор данных, но графический интерфейс останавливается, и я не могу нажать кнопку остановки.

ВЫДЕРЖКИ КОДА: Вот как я реализовал нажатие кнопки "Пуск":

void Dialog::onStartButtonClicked()
{ 
    this->runSensorStartProcess->start("start");
    //this->runSensorStartProcess->waitForFinished(-1);

    //--------------------------
    // udp socket handler starts picking data and write it into a file
    //--------------------------

    if (!this->runSensorStartProcess->waitForStarted())
    {
        qWarning() << "Warning: Cannot start Cygwin process!";
    }
}

Остановка нажатия кнопки аналогична:

void Dialog::onStopButtonClicked()
{
    if(this->runSensorStartProcess.get() != NULL)
    {
        this->runSensorStartProcess->close();
    } 
    this->runSensorStopProcess->start("stop");

    if (!this->runSensorStopProcess->waitForStarted())
    {
        qWarning() << "Warning: Cannot stop Cygwin!";
    }
}

Вопрос:

  1. Как сохранить отзывчивость GUI после runSensorStartProcess начинается?
  2. Как я могу остановить этот процесс по требованию (на самом деле, запустив runSensorStartProcess)?
  3. Нужен ли мне отдельный thread за runSensorStartProcess?

1 ответ

  1. Не используйте ни один из waitForXxx методы. Это все. Да, это так просто.

    Обратите внимание, что для каждого waitForXxx В этом методе есть сигнал, который вы можете прикрепить и таким образом отреагировать на искомое событие.

  2. не являются QProcess::kill а также QProcess::terminate что вам нужно?

  3. Никогда. Смотрите также ответ 1 и ответ 2.

Другие вопросы по тегам