Qtで多重起動禁止とパラメータ付きの起動とコマンドヘルプ表示
今回は前回作成した
をベースに、多重起動禁止とコマンドでパラメータ起動とコマンドヘルプの機能を追加します。
アプリによっては多重起動を禁止にしたい場合もあります。
多重に起動しようとした場合は、その起動をキャンセルします。
また、アプリは本来、端末(コマンドライン)からの起動です。
そこで、端末からのファイル指定起動とパラメータのヘルプ表示を 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
- 作者: 理音伊織
- 発売日: 2018/10/08
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: ダニエルソーリン,Daniel Solin,アットコム
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2001/05
- メディア: 単行本
- 購入: 1人 クリック: 9回
- この商品を含むブログ (2件) を見る
- 作者: Jasmin Blanchette,Mark S,杵渕聡|杉田研治
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/07/30
- メディア: 大型本
- クリック: 62回
- この商品を含むブログ (14件) を見る
Qtで簡単 GUIプログラミング―Qt入門書を読む前に読む「入門書」
- 作者: 曹よしひろ
- 出版社/メーカー: カットシステム
- 発売日: 2009/04
- メディア: 単行本
- クリック: 24回
- この商品を含むブログ (6件) を見る