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

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

ただいまの
回答率

90.33%

  • C#

    7706questions

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

  • C++

    3768questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 387

m_yoko

score 139

 前提・実現したいこと

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

 試したこと

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

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

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

  • VS2017
  • boost 1.67
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2018/06/07 19:03

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

    キャンセル

  • umyu

    2018/06/07 20:14

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

    キャンセル

  • m_yoko

    2018/06/08 12:17

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

    キャンセル

回答 3

checkベストアンサー

+1

こんにちは。

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/08 12:24

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

    キャンセル

+1

こんにちは。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/08 12:26

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

    キャンセル

  • 2018/06/08 12:30

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

    キャンセル

  • 2018/06/08 12:37

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

    キャンセル

  • 2018/06/08 12:41

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

    キャンセル

  • 2018/06/08 12:49

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

    キャンセル

  • 2018/06/08 13:04

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

    キャンセル

0

https://teratail.com/questions/53151

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/08 12:25

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

    キャンセル

同じタグがついた質問を見る

  • C#

    7706questions

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

  • C++

    3768questions

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

  • トップ
  • C#に関する質問
  • バックエンドのプログラムからフロントエンドのプログラムへのデータの受け渡しについて