문제

I am trying to run C++ executables placed inside SBC6845 [inside /ftest as shown ]. Now these executables are running with

while(1){
// around 250-300 lines of code here
}

infinite loop. Now when I run only the codes from terminal, I can kill them whenever I want to. But I am unable to kill them while running from inside the gui. I execute these codes with Qprocess like this:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow){
ui->setupUi(this);

connect(ui->pushButton, SIGNAL(pressed()), SLOT(vcm_test()));
connect(ui->pushButton_2, SIGNAL(pressed()), SLOT(offloader_test()));
connect(ui->pushButton_3, SIGNAL(pressed()), SLOT(quit_vcm()));
connect(ui->pushButton_4, SIGNAL(pressed()), SLOT(quit_offloader()));}
void MainWindow::vcm_test(){
   QProcess::execute("/ftest/vcm_test_2 \r\n");
}
void MainWindow::offloader_test(){
    QProcess::execute("/ftest/off_test_2 \r\n");
}  
void MainWindow::quit_vcm(){
    QProcess::execute("\x001a \r\n");
} 
void MainWindow::quit_offloader(){
    QProcess::execute("\x001a \r\n");   
}

Now the problem is when the pushbutton or pushbutton_2 i.e. vcm_test() or offloader_test() is invoked the gui becomes unresponsive. Since the gui keeps waiting for the code in /ftest to finish quit option does not work and I have to quit it from the terminal again. Also quitting from terminal closes both the code and the gui.

I have tried searching solutions and used threads too. But I get segmentation error while starting a thread from pushbutton.

I need to be able to quit the process while it is being executed (modification of this code or any new idea is very much appreciated). I am a newbie so please ignore my poor coding skills. Thanks.

도움이 되었습니까?

해결책

QProcess::execute(..) waits for the process to finish, that is why your GUI is freezing. Use QProcess::start(..) instead. To quit the process use the QProcess::close() function

Try this:

QProcess *myProcess = new QProcess(this);
myProcess->start("/ftest/vcm_test_2");

And when you want to close the process:

myProcess->close();

You can also connect your pushbutton's clicked signal to the process' kill slot:

connect(ui->pushButton_3, SIGNAL(clicked()), myProcess, SLOT(kill());

다른 팁

You can make a QProcess object and call start() on it. That way the code doesn't get blocked when you execute the process untill it is finished.

QProcess* myprocess=new QProcess();
myprocess->start("/ftest/vcm_test_2");

You can if you want get a signal from myprocess to know if the process is finished. Which is in your case not usefull. You can also close the process by invoking

myprocess->close();

Hope that helpes.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top