勉強会の続きが結構かかってしまったけど何とかそれなりに形になりました。
もしくは、力尽きたともいうorz
とりあえず、完成までの流れおば
QtQuick2でUI描画を作成
勉強会ではここで力尽きました。
QtQuick2でCanvasエレメント上に円グラフを描き描きしてそれらしい形に。
後からTextエレメントでプロセス名の一覧とメモリの使用量を表示できるようにしました。
参考
- QtQuick 5.0: Loader | Documentation | Qt Project
- QtQuick 5.0: Item | Documentation | Qt Project
- QML(Qt)のエレメントを動的に生成をする - 理ろぐ
- Qt 4.7: QML Data Models
QMLとC++の連携
最初作ったプロジェクトではどうもC++の関数が呼べなかったらしく少し回り道を、、、してしまったがプロジェクトを作り直して準備完了。
単純なQStringとかを返すのではなくいろんな情報を持つオブジェクトを返したかったので少し変わった事をしています。
TaskMemGraph/processlist.h at master - sharkpp/TaskMemGraph - GitHub や TaskMemGraph/processinfo.h at master - sharkpp/TaskMemGraph - GitHub など で実装しているのですが、ProcessInfo
クラスはQObject
から派生していて、Q_PROPERTY
でプロパティーを定義しています。
こうすると、QML側では、
var v = item;
var yy = v.name;
みたいに呼び出せます。
で、ProcessList
クラスもQObject
から派生していて、Q_INVOKABLE
で必要なメソッドを定義してあります。
戻り値をQList<QObject*>
で定義するとQML側では、
var v = hoge.data();
for(i in v) {
var yy = v[i].name;
}
みたいに呼び出せます。
もちろん、
qmlRegisterType<ProcessInfo>("ProcessLib",1,0,"ProcessInfo");
qmlRegisterType<ProcessList>("ProcessLib",1,0,"ProcessList");
のような感じで型の登録が必要になります。
ただ、なかなか思ったような処理のやり方がわからず探し回りました。
参考
- [Qt][QML]QMLとC++コードの連携 - Utworks
- Using QML Bindings in C++ Applications | Documentation | Qt Project
- QtQuick での C++ × QML バインディングについてまとめてみた - 凹みTips
- Calling Qt class methods from QML - Nokia Developer Wiki
- Accessing C++ QLists from QML - Stack Overflow
Macでのプロセス操作のプログラミング
ここから、完全に未知の領域です。
Macのプログラム、なにそれ?おいしいの?状態でしたが、、、そもそも、何をキーワードにして検索をすればいいかとか どこを見ればいいかとかが分からず、今回一番苦労したところです。
結局は、Apple Developerが総本山だったってことが分かったのですが、それにしても 目的の処理をしようとする方法も分からず???な状態でしたが、まあ、何とかなるもんです。
参考
- sysctl(3) Mac OS X Developer Tools Manual Page
- Using task_for_pid on Mac OS X (Doug's Note System)
- Mac OS X and task_for_pid() mach call - Ivan's blog
- Evernote 共有ノートブック: IT sec research
- QtDoc 5.0: qmake Platform Notes | Documentation | Qt Project
- (Mac OS X / LINUX での) 外部コマンドの消費メモリのモニタリング - ny23の日記
Windowsでのプロセス操作のプログラミング
こっち側はまあAPIとかは少し探しましたが、まあそれなりで、、、
MSDNで日本語の内容も読めるし圧倒的に日本語の資料が多いので簡単です。
こういうところはユーザー数の違いが顕著に出ますね。
まとめ
初めてQtQuick2をやってみて、、、まあそれなりに手が動いたのはJavaScriptベースだったからでしょうか?
まだ、ちょっと自分の作りたい方向性のものとちょっと違うので、このままどっぷりはまっていくかというとそうでもなさそうですが、 雰囲気は掴めたので何かの時には、またを出しそうな感じです。
そもそも、初っ端からC++との連携とかMacのプロセス操作とかハードルが高すぎましたねorz
sharkpp/TaskMemGraph - GitHubでソースを公開していますがバイナリはなんかdllがたくさん必要なので公開していません。 主にサイズ的な制限で、、、Windows側は必要なDLLが総計40MBですってよorz
ちなみに、動かすのに管理者権限が必要になります。
Mac側は確実に、そして、Windows側はXPでしか試していないですが、恐らく管理者権限が必要だと思います。
Macで動かしたアプリのスクショです。
こっちはWindowsで動かしたアプリのスクショです。
自分で試してみたいという奇特な方は、sharkpp/TaskMemGraph - GitHubからソースを取得して遊んでみてください。
ではでは