質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

1回答

3182閲覧

QT5, C++でQProcessのステータス"finished"を検知する方法について

rimfor

総合スコア1

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

1グッド

0クリップ

投稿2021/07/24 18:25

QT5, C++でQProcessに関してお教えください。

QProcessの終了が検知できません。
実験として以下のコードを書きました。

#include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QProcess process; process.setProgram("lxterminal"); process.start(); while (true) { qDebug() << process.state(); } return a.exec(); }

コード内のlxterminalとは、ターミナルアプリケーションです。

これを実行すると標準出力に
QProcess::ProcessState(Starting)
が表示されますが、起動したlxterminalを閉じてもステータスが変わりません。

process.start()をprocess.startDetatchedにして試しても、QProcess::finishedシグナルでの検出を試みても検知できませんでした。
これとは別にQ_OBJECTを記載したクラスで試してもだめでした。

プロセスの終了を検知する方法をご存知の方、ご教示おねがいいたします。

※環境
Debian 10.10
qt 5.11.3
Qt Creator 4.8.2 based on Qt 5.11.3
gcc (Debian 8.3.0-6) 8.3.0

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題点:
Qt のシグナル・スロットはイベントループ 上 (a.exec内)で稼働します。
a.exec() 前は、イベントループ稼働前なので、シグナル通知を受け取り処理することはできません。

解決策:

  • 方法A: 独自のループではなく、タイマーを使った定期イベント内で state() を監視する。
  • 方法B: while ループ内で イベントループの処理 processEvents を呼び出す

※ processEvents を呼び出す方法を取る場合は、
独自にイベントループを組むので、a.exec を使わない運用にします。

イベントループ内で processEvents を呼び出すと問題になる事があるので、
a.execとの併用は、特別な理由がない限りはお勧めしません。
(稀に起こる・再現性の低い問題になりがちなので、デバッグが難しくなります)

投稿2021/07/25 03:49

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rimfor

2021/07/25 05:00

ご回答頂きましてありがとうございます。 ご教示いただきました、”シグナル・スロットはイベントループ上で稼働する”ということを理解しておりませんでした。 私が試した方法はすべて独自ループ内での監視を試みており、イベントループに処理が回らなかったため、うまく動作しなかったと理解いたしました。 試しに簡単なサンプルを作成し、ご教示いただいた通りタイマーでstateを監視してみたところ、きちんと検知することができました。 迅速に、ご丁寧に、的確にご回答いただきまして、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問