C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: プロセス間通信


(過去ログ 169 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■97417 / inTopicNo.1)  プロセス間通信
  
□投稿者/ kiku (228回)-(2021/05/12(Wed) 08:52:28)

分類:[C#] 

2021/05/12(Wed) 08:53:20 編集(投稿者)

OS:Windows10(64bit)
アプリ:デスクトップFormアプリ
言語:C#

ある機器とCOM接続するためのDLLがメーカから提供があります。
アプリ1つからこの機器を2つ接続する必要があります。
実験したところ、1プロセス内で2つの機器に接続しようとした場合、
同時にオープンすると失敗することがわかりました。

プロセスを2つにし、1プロセスあたり、1つの機器にした場合、
同時にオープン可能でした。

この実験によりメーカから提供されたDLLは、
1プロセスで複数機器に接続することを想定していないと判断しました。

そこで下記のような構成を考えました。
●案1(プロセス3つの構成)
プロセス3でプロセス1(機器1)とプロセス2(機器2)からの
情報を受け取り(逆もあります)、プロセス3で処理したいと思っています。

このように考えた場合、プロセス間通信を考えなければなりませんが、
機器1と2に対して、双方向通信を行う必要があります。
 ・プロセス2、3からイベントを受け取りたい(代替でも良い)。
  イベントの頻度は、100文字ぐらいのデータが
  1秒間に10回程度(上下します)
 ・プロセス2、3のメソッドを動作させたい。
 ・プロセス2,3のプロパティを利用したい。

プロセス間通信として良い方式は何になりますでしょうか?
検索したところ、下記ワードがヒットしましたが、
・Pipes
・RPC
・Shared Memory

一番簡単で、リスクの少ない方法で、通信速度が速い方式を選択したいです。

●案2(アプリケーションドメイン)
1プロセス内にアプリケーションドメインを複数用意し、
アプリケーションドメイン間の通信も考えましたが
そもそも、DLLがアプリケーションドメインに分けることで通信できるかは実験していません。
アプリケーションドメインの作成方法や、
アプリケーションドメイン間の通信方法も調査しきれていません。

上記案1と案2ともに、いままで経験がありません。
本来ですと、プロセス間通信の方式をすべてプログラミング・評価し、
アプリケーションドメインの方式もすべて評価したいのですが、
納期が近いため、その評価を省いて、最適なものを選択できないかと思い、
この掲示板に書き込みさせて頂きました。

アドバイス頂けますと幸いです。


引用返信 編集キー/
■97418 / inTopicNo.2)  Re[1]: プロセス間通信
□投稿者/ shu (1251回)-(2021/05/12(Wed) 09:23:52)
No97417 (kiku さん) に返信
> 2021/05/12(Wed) 08:53:20 編集(投稿者)
>

スレッドで出来るなら1プロセス内にスレッドを分けて実装がよいと思います。
どうしてもプロセスを分けるのならTCPで実装しておけば、コントロールプロセスと
機器と通信するプロセスを別PCに置くとかも出来るので汎用性が高くなると思います。
引用返信 編集キー/
■97419 / inTopicNo.3)  Re[2]: プロセス間通信
□投稿者/ kiku (229回)-(2021/05/12(Wed) 09:40:58)
No97418 (shu さん) に返信
> ■No97417 (kiku さん) に返信
>>2021/05/12(Wed) 08:53:20 編集(投稿者)
>>
>
> スレッドで出来るなら1プロセス内にスレッドを分けて実装がよいと思います。
> どうしてもプロセスを分けるのならTCPで実装しておけば、コントロールプロセスと
> 機器と通信するプロセスを別PCに置くとかも出来るので汎用性が高くなると思います。

複数プロセスにしてしまうと実装が複雑になるので
できればしたくないと思っています。

もう少し現在の状況を説明します。

メーカから提供のあるDLLは下記3つ。
 1.aaa.dll(参照設定が必要)
 2.bbb.dll(exeと同じ位置に配置が必要)
 3.ccc.dll(exeと同じ位置に配置が必要)

利用の仕方は、下記のような感じ。
 ModuleApi kiki = new ModuleApi();
 kiki.Open(COM番号);
 kiki.Start();
 kiki.Stop();
 kiki.Close();
 ※スタートすると、イベントが随時発生。

上記を機器ごとにnewして使っていますが、
複数同時にOpenするとエラーになる。

スレッドで分けると、同時Open可能になる可能性があるのでしょうか?
スレッドは頻繁に利用していますが、
ここで言うスレッドで分けるとは、
スレッド内でnewをするという意味になるでしょうか?
引用返信 編集キー/
■97420 / inTopicNo.4)  Re[3]: プロセス間通信
□投稿者/ shu (1252回)-(2021/05/12(Wed) 09:53:51)
No97419 (kiku さん) に返信

> スレッドで分けると、同時Open可能になる可能性があるのでしょうか?
> スレッドは頻繁に利用していますが、
> ここで言うスレッドで分けるとは、
> スレッド内でnewをするという意味になるでしょうか?
プロセスで分けてOKならスレッドで分けてOKの可能性はあります。
スレッド内でそれぞれnewの意味です。
引用返信 編集キー/
■97421 / inTopicNo.5)  Re[4]: プロセス間通信
□投稿者/ kiku (230回)-(2021/05/12(Wed) 09:55:41)
No97420 (shu さん) に返信
> ■No97419 (kiku さん) に返信
>
>>スレッドで分けると、同時Open可能になる可能性があるのでしょうか?
>>スレッドは頻繁に利用していますが、
>>ここで言うスレッドで分けるとは、
>>スレッド内でnewをするという意味になるでしょうか?
> プロセスで分けてOKならスレッドで分けてOKの可能性はあります。
> スレッド内でそれぞれnewの意味です。

なるほど、スレッド内でnewで動作するのであるならば
これが一番良いですね。
確認してみます。
※返答に時間はかかるかもしれません。
引用返信 編集キー/
■97422 / inTopicNo.6)  Re[5]: プロセス間通信
□投稿者/ kiku (231回)-(2021/05/12(Wed) 11:18:41)
No97421 (kiku さん) に返信
> ■No97420 (shu さん) に返信
>>■No97419 (kiku さん) に返信
> なるほど、スレッド内でnewで動作するのであるならば
> これが一番良いですね。
> 確認してみます。
> ※返答に時間はかかるかもしれません。

個別のスレッド内でnewしても改善しませんでした。
うーん。残念。

> どうしてもプロセスを分けるのならTCPで実装しておけば、コントロールプロセスと
> 機器と通信するプロセスを別PCに置くとかも出来るので汎用性が高くなると思います。

別PCとの通信は必要なく、同一PC内の通信でOKです。
TCPでも実装はできるのですが、
これよりも簡単にできる方法はないでしょうか?
引用返信 編集キー/
■97423 / inTopicNo.7)  Re[6]: プロセス間通信
□投稿者/ kiku (232回)-(2021/05/12(Wed) 11:22:35)

使ったことがないのでトンチンカンなことを言っているかもしれませんが、
個別スレッド内で、アプリケーションドメインを作成し、
そのアプリケーションドメイン内で、newすれば、
プロセスに分ける場合と同じようなことになりますでしょうか?

この場合のアプリケーションドメイン間の通信は必要?
メソッド呼び出しとか直接呼出しできるのかなー
引用返信 編集キー/
■97424 / inTopicNo.8)  Re[7]: プロセス間通信
□投稿者/ shu (1253回)-(2021/05/12(Wed) 11:36:22)
No97423 (kiku さん) に返信
>
> 使ったことがないのでトンチンカンなことを言っているかもしれませんが、
> 個別スレッド内で、アプリケーションドメインを作成し、
> そのアプリケーションドメイン内で、newすれば、
> プロセスに分ける場合と同じようなことになりますでしょうか?
>
> この場合のアプリケーションドメイン間の通信は必要?
> メソッド呼び出しとか直接呼出しできるのかなー
使ったことはないので予想ですが、
AppDomainクラスにあるSetData,GetDataでデータのやり取りができるので
これを利用してメソッドを実行するようにするとよいかと思います。
イベントが用意されていないのでタイマーなどで定期的に状態チェックを
行う必要があるかと思います。
引用返信 編集キー/
■97425 / inTopicNo.9)  Re[8]: プロセス間通信
□投稿者/ kiku (233回)-(2021/05/12(Wed) 11:51:05)
No97424 (shu さん) に返信
> ■No97423 (kiku さん) に返信
> 使ったことはないので予想ですが、
> AppDomainクラスにあるSetData,GetDataでデータのやり取りができるので
> これを利用してメソッドを実行するようにするとよいかと思います。
> イベントが用意されていないのでタイマーなどで定期的に状態チェックを
> 行う必要があるかと思います。

なるほど。
AppDomain間の通信は、電文みたいなやりとりになるイメージで理解しました。
となると、TCPとあまりかわらない感じですね。
使ったことがないということなので
あまりレアな実装はしたくないので、
この方法は諦めます。
引用返信 編集キー/
■97427 / inTopicNo.10)  Re[1]: プロセス間通信
□投稿者/ kiku (234回)-(2021/05/12(Wed) 16:17:40)
No97417 (kiku さん) に返信
> 2021/05/12(Wed) 08:53:20 編集(投稿者)
> プロセス間通信として良い方式は何になりますでしょうか?
> 検索したところ、下記ワードがヒットしましたが、
> ・Pipes
> ・RPC
> ・Shared Memory

現在、プロセス間通信として共有メモリを使う方法を検討しています。

機器1からのイベント情報を共有メモリ1に書き込み、
機器2からのイベント情報を共有メモリ2に書き込み、
処理プロセスは、共有メモリ1および共有メモリ2から読取を行うことを考えています。

このときに、この共有メモリをキューのような扱い方をしたいのですが
可能でしょうか?
具体的には下記のような感じです。
排他制御が必要になりますでしょうか?
使い方が間違っていますでしょうか?

機器1プロセス
 ・共有メモリ1を作成する。
 ・イベントが発生したら、共有メモリ1に書き込む

機器2プロセス
 ・共有メモリ2を作成する。
 ・イベントが発生したら、共有メモリ2に書き込む

処理プロセス
 ・共有メモリ1を監視し、書き込まれていたら、その内容を取得し、削除する。
 ・共有メモリ1を監視し、書き込まれていたら、その内容を取得し、削除する。

引用返信 編集キー/
■97428 / inTopicNo.11)  Re[2]: プロセス間通信
□投稿者/ Hongliang (1170回)-(2021/05/12(Wed) 16:33:12)
その辺を一から実装するのは面倒かつバギーなのであまりお勧めできません。
.NET FrameworkであればWCF, .NET Core/5+であればgRPCを使うのはどうでしょうか。
どちらもメソッド呼び出しの形でプロセス間通信可能です。サーバプッシュも可能だったはず。

その中で、どういう通信方法を使うかというのはまた別の話です。
// WCFならnet.pipe(名前付きパイプ)、gRPCならTCPかUnixDomainSocketかな。
引用返信 編集キー/
■97429 / inTopicNo.12)  Re[3]: プロセス間通信
□投稿者/ kiku (235回)-(2021/05/12(Wed) 16:49:52)
No97428 (Hongliang さん) に返信
> その辺を一から実装するのは面倒かつバギーなのであまりお勧めできません。
> .NET FrameworkであればWCF, .NET Core/5+であればgRPCを使うのはどうでしょうか。
> どちらもメソッド呼び出しの形でプロセス間通信可能です。サーバプッシュも可能だったはず。
>
> その中で、どういう通信方法を使うかというのはまた別の話です。
> // WCFならnet.pipe(名前付きパイプ)、gRPCならTCPかUnixDomainSocketかな。

.NETFrameWork4.8を利用しています。
ぐぐってみたところ、下記の名前付きパイプがヒットしました。
https://www.chuken-engineer.com/entry/2020/12/25/084124
なるほど、つかえそうですね。

1つ質問があります。
パイプの場合、1対1の通信になりますでしょうか?
1対1なら、名前付きパイプの名前を変えて、2つパイプを用意することを考えます。
1対多が可能なら、パイプが1つで実現可能なのかなと。
引用返信 編集キー/
■97430 / inTopicNo.13)  Re[4]: プロセス間通信
□投稿者/ Hongliang (1171回)-(2021/05/12(Wed) 17:12:22)
もう一度言いますが、通信経路を生で使うのはお勧めしません。

> 1つ質問があります。
> パイプの場合、1対1の通信になりますでしょうか?
> 1対1なら、名前付きパイプの名前を変えて、2つパイプを用意することを考えます。
> 1対多が可能なら、パイプが1つで実現可能なのかなと。
1対多は可能です。
WCFであればその辺も特に考えずに利用できます。
引用返信 編集キー/
■97431 / inTopicNo.14)  Re[5]: プロセス間通信
□投稿者/ kiku (236回)-(2021/05/12(Wed) 17:33:34)
No97430 (Hongliang さん) に返信
> もう一度言いますが、通信経路を生で使うのはお勧めしません。
>
>>1つ質問があります。
>>パイプの場合、1対1の通信になりますでしょうか?
>>1対1なら、名前付きパイプの名前を変えて、2つパイプを用意することを考えます。
>>1対多が可能なら、パイプが1つで実現可能なのかなと。
> 1対多は可能です。
> WCFであればその辺も特に考えずに利用できます。

Hongliangさんの言っている意味が分かっていないのだと思います。

こちらでぐぐった下記URLは生で使っているということに該当するのでしょうか?
https://www.chuken-engineer.com/entry/2020/12/25/084124

WCFでぐぐってみると、WEBサービス系の情報はでますが
利用できそうな情報にたどり着けませんでした。
実装で利用できそうな紹介ページを教えて頂けないでしょうか?

引用返信 編集キー/
■97432 / inTopicNo.15)  Re[6]: プロセス間通信
□投稿者/ Hongliang (1172回)-(2021/05/12(Wed) 18:27:29)
2021/05/12(Wed) 18:28:24 編集(投稿者)

https://www.bing.com/search?q=WCF+C%23+console
こんな感じでいかがでしょうか。
引用返信 編集キー/
■97433 / inTopicNo.16)  Re[7]: プロセス間通信
□投稿者/ kiku (237回)-(2021/05/12(Wed) 18:45:21)
No97432 (Hongliang さん) に返信
> 2021/05/12(Wed) 18:28:24 編集(投稿者)
>
> https://www.bing.com/search?q=WCF+C%23+console
> こんな感じでいかがでしょうか。

使ってみないと、この先に進めそうもないので
チャレンジしてみます。
引用返信 編集キー/
■97446 / inTopicNo.17)  Re[8]: プロセス間通信
□投稿者/ kiku (238回)-(2021/05/14(Fri) 17:28:41)
No97433 (kiku さん) に返信
> ■No97432 (Hongliang さん) に返信
>>2021/05/12(Wed) 18:28:24 編集(投稿者)
>>
>>https://www.bing.com/search?q=WCF+C%23+console
>>こんな感じでいかがでしょうか。
>
> 使ってみないと、この先に進めそうもないので
> チャレンジしてみます。

いろいろ試したところ、下記の記事のような方法で、実装することで
プロセス間通信を行えることを確認し、
機器2台と正常に通信できることを確認しました。
アドバイス頂き、ありがとうございました。

https://araramistudio.jimdo.com/2020/05/11/c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1-ipc%E9%80%9A%E4%BF%A1/
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -