QT は QProcess を使用して Linux 環境でプログラムを終了します

Windows でプログラムを閉じる方法:

Qt コードでは、qprocess がサードパーティ プログラムを呼び出す必要があり、呼び出しが完了した後に終了する必要がある場合があります。手動でフォークアウトするのは適していません。このとき、ウィンドウの下で taskkill プログラムを呼び出してプログラムを閉じることができます。

Qプロセスプロセス;
process.execute("taskkill /im xx.exe /f");

Linuxでプログラムを閉じる方法

Ubuntu では、kill コマンドを使用してプロセスを終了できます。Qtコードでkillコマンドを使用するには、QProcessクラスを継承することで実現できます。
コードは以下のように表示されます。

```
#include <QtCore>

class MyProcess : public QProcess { public:   void stopProcess() {     if (state() != QProcess::NotRunning) {       terminate(); // SIGTERM シグナルを送信       waitForFinished(); // プロセスが終了するのを待ちます     }   } } ;







int main(int argc, char *argv[])
{   QCoreApplication a(argc, argv);   MyProcess process;   process.start("your_program"); // 終了する必要があるプログラムを呼び出します

  

  process.stopProcess(); // プログラムを終了します

  a.exec() を返します。
}
```

ここではカスタム MyProcess クラスを使用して QProcess を継承し、stopProcess() メソッドを追加してプロセスを終了する機能を実装します。

stopProcess() メソッドは、まず SIGTERM シグナルを送信してプロセスを終了し、次にプロセスが完全に終了するまで待機します。waitForFinished() が呼び出されない場合、プロセスが完全に終了せずにシャットダウンされる可能性があります。

このコードの改善を続け、実行されたコンソール プログラムの出力内容を MyProcess クラスにカプセル化し、リアルタイム qdebug で表示します。
より良い解決策を探しています。実行されたコンソール プログラムの出力コンテンツをカプセル化し、リアルタイムで QDebug に表示できるように、このコードを改善し続けることができます。
変更されたコードは次のとおりです。

```
#include <QtCore>

class MyProcess : public QProcess { public:     MyProcess() {         connect(this, &QProcess::readyReadStandardOutput, [=](){             QByteArray Output = this->readAllStandardOutput();             //QByteArray は QString に変換され、末尾の改行             QString テキストが削除されます(出力);             text.chop(1);             qDebug() << text;         });     }









    void stopProcess() {         if (state() != QProcess::NotRunning) {             terminate(); // SIGTERM シグナルを送信             waitForFinished(); // プロセスが終了するのを待ちます         }     } };





int main(int argc, char *argv[])
{   QCoreApplication a(argc, argv);   MyProcess process;   process.start("your_program"); // 終了する必要があるプログラムを呼び出します

  

  process.waitForFinished(); //プログラムの実行が終了するまで待ちます

  a.exec() を返します。
}
```

MyProcess クラスのコンストラクターに、QProcess の `readyReadStandardOutput()` シグナルに接続されたラムダ式を追加して、呼び出し側プログラムによって出力されたコンテンツをリアルタイムで取得し、QDebug を通じてリアルタイムで出力しました。

次に、プログラム内でプロセスの waitForFinished() メソッドを呼び出し、プログラムの実行が完了するのを待ちます。プログラムの実行中、MyProcess クラスは呼び出し元プログラムから取得した出力内容をコンソールに出力します。

注: waitForFinished() メソッドを使用すると、プログラムの実行がブロックされ、大量の出力コンテンツが生成されると、プログラムがブロックされて応答できなくなる可能性があります。ブロッキングを回避する必要がある場合は、QProcess のシグナルとスロットを使用できます。

この例では、 qDebug() << text; は stopProcess() process.waitForFinished(); の後に実行され、プログラムの実行が終了するのを待ってから出力されます。実行したプログラムのリアルタイム出力情報をリアルタイムに出力する方法はありますか?

この問題は、`qDebug() << text` が MyProcess クラスのシグナル スロット関数で非同期操作を使用しているため、つまり、プログラムの出力を取得するときにシグナル通知がメイン スレッドに送信されて出力されるためです。プログラムが実行されるのを待つため、出力する前にプログラムが実行されるまで待つ必要があります。

実行プログラムの出力情報のリアルタイム出力を実現するには、`qDebug() << text`の出力をメインプロセスに移して実行する必要があります。具体的な実装は、メイン プロセスにループを確立して、MyProcess クラスに格納されている出力キャッシュをリアルタイムで読み取り、コンソールに出力することで実現できます。
コードは以下のように表示されます。

```
#include <QtCore>

class MyProcess : public QProcess { public:     MyProcess() {         connect(this, &QProcess::readyReadStandardOutput, [=](){             QByteArray Output = this->readAllStandardOutput();             //QByteArray は QString に変換され、末尾の改行             QString テキストが削除されます(出力);             text.chop(1);             outputBuffer.append(text);         });     }









    void stopProcess() {         if (state() != QProcess::NotRunning) {             terminate(); // SIGTERM シグナルを送信             waitForFinished(); // プロセスが終了するのを待ちます             qDebug() << OutputBuffer; // 出力バッファ出力ストレージ用         }     }





保護:
    QString 出力バッファ;
};

int main(int argc, char *argv[])
{   QCoreApplication a(argc, argv);

  MyProcess process;
  process.start("your_program"); //終了する必要があるプログラムを呼び出します

  while(process.state() != QProcess::NotRunning){       a.processEvents(); //メインプロセスイベントループをトリガーし、受信イベントを処理します       QByteArray Output = process.readAllStandardOutput();       if(!output.isEmpty( )){           QString text(output);            text.chop(1);           qDebug() << text; //リアルタイム出力プログラムの出力内容       }   }







  process.stopProcess(); // プログラムを終了します

  a.exec() を返します。
}
```

この変更されたコードでは、プログラムの出力バッファを格納するための `outputBuffer` メンバー変数を追加しました。MyProcess クラスの「readyReadStandardOutput()」シグナルとスロット関数では、取得したプログラム出力が出力キャッシュに格納されます。

メインプロセスでは、while ループを使用してイベントを継続的に処理し、プログラムの出力があるかどうかを確認します。
プログラムが出力している場合はリアルタイムで出力し、そうでない場合はプログラムの実行が完了した後、再度 `stopProcess()` メソッドを呼び出してプログラムの出力バッファを出力します。

このようにして、ハンドラーの出力をリアルタイムで追跡できます。「しかし、結局、この実装現象は実現しませんでした。
            
 

おすすめ

転載: blog.csdn.net/thanklife/article/details/131105862