質問: ### 前提・実現したいこと C++でバックエンドのプログラムを書き、それのGUIとしてフロントエンドのプログラムをC#で書こうと思っています。 バックエンドのプログラムは、ただのハッシュ計算をするプログラムなのですが、最終的な出力は計算されたハッシュ値を、途中の出力はリアルタイムで進行度合いを出力し、それをフロントエンド側で受けたいと思っています。 バックエンドのプログラムはハッシュ値を出力できるようにはなりましたが、途中の進行度合いを出力して、フロントエンド側でそれを受け取るいい方法が思い浮かびません。 バックエンドのプログラムは標準出力にハッシュ値が出るようになっていますが、標準エラー出力にどれくらい何パーセント計算が終わったかを出力すればフロントエンド側から取れるのでしょうか? フロントエンドから起動したモードになるような引数を用意して、バックエンドだけで利用したときと区別するようにすればバックエンドで利用したときに表示が汚くなることはないと思うのですが、それとも同じように起動して表示が汚くならないようなうまい方法があるのでしょうか? バックエンド単体で起動したときはエスケープシーケンスの"\r"を利用して、パーセンテージをバーと数値で出すようにするつもりです。 現時点で環境依存なコードは書いていないので、可能ならば環境依存なコードをバックエンドに書きたくなく、それらはフロントエンド側でどうにかしようかなと考えています。 ### 試したこと ファイルに出力して、それを読むというのは考えましたが、異常終了したときにゴミが残ることも考えてできれば避けたいです。 可能であれば標準出力、エラー出力を使ってどうにかしたいですが、無理なら汎用的な別なものを利用したいです。 プロセス間通信についてあまり知識がないため、これについて調べる等がありましたらお願いします。 ### 補足情報(FW/ツールのバージョンなど) バックエンドのプログラムは単体でも動く、コンソールアプリケーションです。 また、バックエンドとフロントエンドで分けたいのは、バックエンドのプログラムに可搬性を求めるため、環境依存なものはフロントエンドだけにしたいです。 現状では、LinuxとWindowsどちらでも動くプログラムを作っています。 とっつきやすさとしてC#のXAMLを使ってフロントエンドを書くつもりです。 Qtで書けばどちらでも動くと思いますがC#の勉強も兼ねてC#にしています。 個人で書いてるプログラムなので、使うソフトウェアの制約等は他にないです。ライブラリを増やしてもいいです。 環境 * VS2017 * boost 1.67
回答: こんにちは。 進捗度合いがただの数値であれば**共有メモリ**を使って実現できるかと思います。 ただし、実現したい内容に対して処理のボリュームが大きすぎるように感じますので、一例とお考え下さい。 共有メモリを用意します。 バックエンドのプログラムは進捗の度合いを都度書き込みます。フロントエンドのプログラムは定期的に共有メモリの現在の進捗を読み込んで表示します。 なお、この場合標準入出力に対する出力を必要としないため、コンソールに必要のない情報が出ないことも利点かと思います。 Qiita にマッチしそうな記事がありました。 .Net(C# WPF)アプリとWin32アプリ(C++)でファイルマッピングを使って構造体データをプロセス間通信させる リアルタイムに進捗が知りたい場合は、バックエンドからオリジナルのウインドウメッセージを飛ばして更新を通知することも可能かと思います。 参考になれば幸いでございます。