0

SBC6845 内 [図のように /ftest 内] に配置された C++ 実行可能ファイルを実行しようとしています。現在、これらの実行可能ファイルは

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

無限ループ。ターミナルからコードのみを実行すると、いつでもそれらを殺すことができます。しかし、GUI 内から実行中にそれらを殺すことはできません。これらのコードを Qprocess で次のように実行します。

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");   
}

ここでの問題は、pushbuttonまたはpushbutton_2 ievcm_test()またはoffloader_test()が呼び出されると、GUI が応答しなくなることです。GUI は /ftest のコードが終了するのを待ち続けるため、quit オプションが機能せず、ターミナルから再度終了する必要があります。また、ターミナルを終了すると、コードと GUI の両方が閉じます。

私は解決策を検索してみましたが、スレッドも使用しました。しかし、プッシュボタンからスレッドを開始すると、セグメンテーション エラーが発生します。

実行中にプロセスを終了できるようにする必要があります (このコードの変更または新しいアイデアは大歓迎です)。私は初心者なので、私のコーディングスキルの低さは無視してください。ありがとう。

4

2 に答える 2

2

QProcess::execute(..)はプロセスが終了するのを待ちます。そのため、GUI がフリーズしています。代わりにQProcess::start(..)を使用してください。プロセスを終了するには、QProcess::close()関数を使用します

これを試して:

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

そして、プロセスを閉じたいとき:

myProcess->close();

プッシュボタンのクリック信号をプロセスの kill スロットに接続することもできます。

connect(ui->pushButton_3, SIGNAL(clicked()), myProcess, SLOT(kill());
于 2013-05-10T10:21:34.663 に答える
0

QProcess オブジェクトを作成し、その上で start() を呼び出すことができます。そうすれば、プロセスが終了するまでプロセスを実行してもコードがブロックされません。

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

プロセスが終了したかどうかを知るために、 myprocess からシグナルを取得することができます。あなたの場合、これは役に立ちません。呼び出してプロセスを閉じることもできます

myprocess->close();

それが役立つことを願っています。

于 2013-05-10T10:16:14.840 に答える