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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

Q&A

解決済

3回答

660閲覧

バックエンドのプログラムからフロントエンドのプログラムへのデータの受け渡しについて

m_yoko

総合スコア156

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

0グッド

0クリップ

投稿2018/06/07 09:47

編集2018/06/08 03:22

前提・実現したいこと

C++でバックエンドのプログラムを書き、それのGUIとしてフロントエンドのプログラムをC#で書こうと思っています。
バックエンドのプログラムは、ただのハッシュ計算をするプログラムなのですが、最終的な出力は計算されたハッシュ値を、途中の出力はリアルタイムで進行度合いを出力し、それをフロントエンド側で受けたいと思っています。
バックエンドのプログラムはハッシュ値を出力できるようにはなりましたが、途中の進行度合いを出力して、フロントエンド側でそれを受け取るいい方法が思い浮かびません。
バックエンドのプログラムは標準出力にハッシュ値が出るようになっていますが、標準エラー出力にどれくらい何パーセント計算が終わったかを出力すればフロントエンド側から取れるのでしょうか?
フロントエンドから起動したモードになるような引数を用意して、バックエンドだけで利用したときと区別するようにすればバックエンドで利用したときに表示が汚くなることはないと思うのですが、それとも同じように起動して表示が汚くならないようなうまい方法があるのでしょうか?
バックエンド単体で起動したときはエスケープシーケンスの"\r"を利用して、パーセンテージをバーと数値で出すようにするつもりです。
現時点で環境依存なコードは書いていないので、可能ならば環境依存なコードをバックエンドに書きたくなく、それらはフロントエンド側でどうにかしようかなと考えています。

試したこと

ファイルに出力して、それを読むというのは考えましたが、異常終了したときにゴミが残ることも考えてできれば避けたいです。
可能であれば標準出力、エラー出力を使ってどうにかしたいですが、無理なら汎用的な別なものを利用したいです。
プロセス間通信についてあまり知識がないため、これについて調べる等がありましたらお願いします。

補足情報(FW/ツールのバージョンなど)

バックエンドのプログラムは単体でも動く、コンソールアプリケーションです。
また、バックエンドとフロントエンドで分けたいのは、バックエンドのプログラムに可搬性を求めるため、環境依存なものはフロントエンドだけにしたいです。
現状では、LinuxとWindowsどちらでも動くプログラムを作っています。
とっつきやすさとしてC#のXAMLを使ってフロントエンドを書くつもりです。
Qtで書けばどちらでも動くと思いますがC#の勉強も兼ねてC#にしています。
個人で書いてるプログラムなので、使うソフトウェアの制約等は他にないです。ライブラリを増やしてもいいです。
環境

  • VS2017
  • boost 1.67

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

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

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

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

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

dodox86

2018/06/07 10:03

標準出力、エラー出力を使う予定ということですが、コンソールアプリで良いのでしょうか。
umyu

2018/06/07 11:14

フロントエンドとバックエンドを分けたい理由(制約事項)は何かありますかー?
m_yoko

2018/06/08 03:17

すみません、補足で質問に追記致します。
guest

回答3

0

ベストアンサー

こんにちは。

進捗度合いがただの数値であれば** 共有メモリ **を使って実現できるかと思います。
ただし、実現したい内容に対して処理のボリュームが大きすぎるように感じますので、一例とお考え下さい。

共有メモリを用意します。
バックエンドのプログラムは進捗の度合いを都度書き込みます。フロントエンドのプログラムは定期的に共有メモリの現在の進捗を読み込んで表示します。
なお、この場合標準入出力に対する出力を必要としないため、コンソールに必要のない情報が出ないことも利点かと思います。

Qiita にマッチしそうな記事がありました。
.Net(C# WPF)アプリとWin32アプリ(C++)でファイルマッピングを使って構造体データをプロセス間通信させる

リアルタイムに進捗が知りたい場合は、バックエンドからオリジナルのウインドウメッセージを飛ばして更新を通知することも可能かと思います。

参考になれば幸いでございます。

投稿2018/06/07 13:07

編集2018/06/07 13:08
g_uo

総合スコア212

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

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

m_yoko

2018/06/08 03:24

確かにやりたいことに対して使う道具が大きすぎますが、現状一番マッチしそうな感じがします。
guest

0

こんにちは。

Processクラスが使えると思います。
↓参考になると思います。
DOSコマンドを実行し出力データを取得する

投稿2018/06/07 10:21

Chironian

総合スコア23272

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

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

m_yoko

2018/06/08 03:26

C#側のプログラムの参考にさせていただきます。
Chironian

2018/06/08 03:30

バックエンド側がコンソールアプリで、それをC#から使い、かつ、バックエンドの標準入出力を使ってC#とデータをやり取りしたい場合は、適切な手法ですよ。意外によく使われている手法でもありますし。
m_yoko

2018/06/08 03:37

現状の構想としては、バックエンド内部で共有メモリ(グローバル変数は使いたくないのと関数の引数に進捗の度合いを入れる変数のポインタを渡すのも違和感があるため)を使って、計算部と表示部でマルチスレッドで動かして、それぞれ進捗がどれくらいかを受け渡し、標準出力にハッシュ値を出して、エラー出力に進捗度合いを吐き出すつもりです。そしてフロントのC#側でバックエンドの標準出力のハッシュ値をProcessクラスを使って受け取るつもりです。フロント側で進捗の度合いをエラー出力で受け取るか共有メモリで受け取るかは未定ですが、ハッシュ値はバックエンドの標準出力に出すのが暫定ですので、Processクラスを使って受け取るのも暫定的に確定してます。
Chironian

2018/06/08 03:41

データの受け渡し方を質問されていたのでは? 既にProcessクラスを使って標準入出力でデータを受け渡しすることが確定しているのでしたら、何を質問されたかったのでしょうか? あ、Processクラスは当然標準エラー出力も受け取れますよ。
m_yoko

2018/06/08 03:49

あ、いえいえ、他の人の回答から共有メモリを、Chironianさんの回答からProcessクラスを使うことにしたので、暫定的に確定してるっていうのは回答を貰ってそういうことにするつもりになりましたってコメントでした。 なのでChironianさんの回答を参考にしての構想ですよ。 進捗度合いは単純に0~1000(つまり0.0%から100.0%)の数値を受け取って、表示する側でそれを文字で表現したり、プログレスバーで表現したりしたほうが簡単かなぁと思ったので、共有メモリで受け取ろうかなぁと思ってます。標準エラー出力で得られる文字列は単純な数値(上の0~1000)から、整形された文字列(計算中。。。25.2%)みたいなものに変換されて出力されるのでそれをいちいちパースしたりするのも面倒かなぁって感じです。
Chironian

2018/06/08 04:04

なるほど。了解です。絡んでしまってごめんさい。
guest

0

https://teratail.com/questions/53151

ソケット通信はいかがでしょう。

投稿2018/06/07 10:09

mkgrei

総合スコア8560

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

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

m_yoko

2018/06/08 03:25

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問