retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

Qtで多重起動禁止とパラメータ付きの起動とコマンドヘルプ表示

 今回は前回作成した

retiresaki.hatenablog.com

をベースに、多重起動禁止とコマンドでパラメータ起動とコマンドヘルプの機能を追加します。

 アプリによっては多重起動を禁止にしたい場合もあります。
多重に起動しようとした場合は、その起動をキャンセルします。

 また、アプリは本来、端末(コマンドライン)からの起動です。
そこで、端末からのファイル指定起動とパラメータのヘルプ表示を QCommandLineParser を使って処理します。

記事後半でソース・リソース等一式のZIPファイルがダウンロードできます。
Ubuntu 18.04 LTS で作成しています。

今回は main のみ張り付けます。


main.cpp

#include "mainwindow.h"
#include <QApplication>


bool chk_multiple_startup(QString s_process_name)
{
    FILE *fp;
    QString str;
    int  ncnt;
    ncnt=0;
    str = "ps h o comm -C " + s_process_name;
    if ((fp = popen(const_cast<char*>(str.toUtf8().data()),"r"))==nullptr)
        return(true);
    while(1){
        char c_str[512]={0};
        if(fgets(c_str,255,fp)==nullptr)
            break;
        if (strstr(c_str,"grep")==nullptr)
            ncnt++;
        if(feof(fp))
            break;
    }
    pclose(fp);
    if (ncnt > 1){
        return(false);
    }
    return(true);
}

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

    // multiple startup check <- this !!
    QString s_appname = QFileInfo(QCoreApplication::applicationFilePath()).baseName();
    if (!chk_multiple_startup(s_appname)){
        qInfo() << "this application has already been started :"
                  << s_appname;
        return 1;
    }

    // use CommandLineParser
     QCommandLineParser parser;

     parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
     parser.addHelpOption();

     // option -f [file]
     QCommandLineOption readFile("f", "Read specified XSPF file", "file");
     parser.addOption(readFile);

     // check parameter
     if ( !parser.parse(QCoreApplication::arguments())) {
         return 1;
     }
     parser.process(a);

     // get param
     QString str_readfile;
     if ( parser.isSet(readFile) ) {
        str_readfile = parser.value(readFile);
     }

    MainWindow w;

    w.setParam_readfile(str_readfile);
    w.show();

    return a.exec();
}

A.多重起動の禁止

main.cpp に
 bool chk_multiple_startup()
という関数を作って、
その中で
 "ps h o comm -C "
というコマンドを実行し、自身の起動アプリファイル名がいくつ起動しているか確認します。
その数が自身を含めた数以上、つまり2以上なら既に起動されているということになります。

詳しくはソースを参照してください。

今回は PSコマンドに対応しているものです。
Windowsの場合、tasklist(?)だったと思いますので、それに変更します。
全OSに対応するのは簡単ですので、任意に変更してください。

Qtだけでもできそうですが、面倒なのでやっていませんw
気が向いたら調べてみたいと思います。

B.端末からのファイル指定起動とパラメータのヘルプ表示

 パラメータ指定時の実際の起動はこんな感じです。


今回は、簡単な処理していていません。

 QCommandLineParser
を使って起動パラメータを処理しています。

 setSingleDashWordOptionMode (QCommandLineParser::ParseAsLongOptions);
 addHelpOption();

の2つを呼び出すことで、
 パラメータの使用
 ヘルプ表示

を使うことを宣言します。

 QCommandLineOption readFile("f", "Read specified XSPF file", "file");
により、オプション指定を設定します。
各指定パラメータは
 起動パラメータの名称
 起動パラメータの説明
 デフォル値

となります。

 addOption(readFile);
により、上記オプションをパーサーに追加します。

必要なパラメータ分、上記の2つを繰り返します。

 parser.parse(QCoreApplication::arguments())
により、パーサーに実際の起動パラメータを与えます。

もし、パラメータに指定のもの以外のがあった場合、
 false
が戻りますので、main処理をリターンします。

このとき、-h などヘルプ指定がされていた場合、
コマンドヘルプをこんな風に表示します。

 parser.process(a);
により、コマンドライン引数を処理します。

 parser.isSet(readFile)
により、オプションで指定したパラメータが存在するかチェックします。
存在していれば、実際に処理します。

最低限の機能しか使っていませんが、入力パターンなどの判断などを追加していくことも必要でしょう。

他のクラスファイルやリソースファイルなどはZIPファイルをダウンロードして確認してください。

ZIP-file (59KB) download from Google DRIVE

 空いた時間を見つけながら作成しているので、バグ等があってもご愛嬌でお願いします。(簡単なデバックと動作テストしかしていません)
 今回は表示だけですが、最終的にはエディターとなる予定です (^^♪
また、区切りの良いタイミングで公開しますので、気長にお待ちくださいw

24時間集中講座 Qtプログラミング

24時間集中講座 Qtプログラミング

  • 作者: ダニエルソーリン,Daniel Solin,アットコム
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2001/05
  • メディア: 単行本
  • 購入: 1人 クリック: 9回
  • この商品を含むブログ (2件) を見る
Qt GUIプログラミング (C magazine)

Qt GUIプログラミング (C magazine)

Qtで簡単 GUIプログラミング―Qt入門書を読む前に読む「入門書」

Qtで簡単 GUIプログラミング―Qt入門書を読む前に読む「入門書」

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。