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!";
}
}
Вопрос:
- Как сохранить отзывчивость GUI после
runSensorStartProcess
начинается? - Как я могу остановить этот процесс по требованию (на самом деле, запустив
runSensorStartProcess
)? - Нужен ли мне отдельный
thread
заrunSensorStartProcess
?
1 ответ
Не используйте ни один из
waitForXxx
методы. Это все. Да, это так просто.Обратите внимание, что для каждого
waitForXxx
В этом методе есть сигнал, который вы можете прикрепить и таким образом отреагировать на искомое событие.не являются
QProcess::kill
а такжеQProcess::terminate
что вам нужно?