none
WinAP間の通信方法は? RRS feed

  • 質問

  • Windows(XP)下で走行させる複数の独立したアプリケーション

    プログラムを用意するとします。

    こららのアプリケーション間で何かのEvent発生に関し

    eventを検出したアプリケーションAから

    他のアプリケーションBへ情報を伝える方法(API等)の

    概略を教えて下さい。

     

    アプリケーションA:

    ひとつのアプリケーションがプログラム処理に非同期に発生する

    eventを常時見張り、eventをアプリケーションBへ送ります。

     

    アプリケーションB:

    enentを受信したアプリケーションが対応する

    処理をさせます。

    2008年4月26日 5:45

回答

  • まさにEventというオブジェクトがあるので、それと共有メモリとかですかね。

    CreateEvent http://msdn2.microsoft.com/en-us/library/ms682396(VS.85).aspx

    他にもパイプとか、WinSock使うとか、伝統的なWindow Message(RegisterWindowMessageで独自メッセージを作る)使うとか、要件に応じていろいろ方法はあります。

    2008年4月26日 10:54
  • 「何をしたいか」によると思います。

    全てのパターンでできるかと問われれば、「多分無理でしょう」という回答にならざる得ません。

    どのようなことを実現したいのか、もう少し具体的な例を示した方が、回答を得やすいと思います。

     

    ところで、「Eventを送る」と書かれていますが、これは「メッセージ」じゃないですか?

    PostMessage, SendMessage等で扱うものは「メッセージ」と呼び、Eventではありません。

    (広い意味でのEventであれば含むかと思いますが、Win32APIベースの話では含まないと考えます)

     

    独り言

    APと言われるとAccess Point、Win32APと言われるとWin32APIを思い浮かべるなぁ。

    Application→Appという認識なのはMFC(CWinApp)の影響かしら…。
    2008年4月29日 6:42
    モデレータ
  • うーん、どういうことをやられたいのか今一つ見えませんが…。

     

    極端な話、ローカルでIIS(httpサーバ)を動かして、アプリケーションAからmetaタグにrefreshを指定して、一定間隔で読み込むhtmlを吐き出して、IE側ではそれを読ませたって、立派なイベント通知なわけですし。

     

    2008年4月29日 16:37
  •  dimension さんからの引用

    Event driven というか割り込みという感じでWEBサーバのマシンから

    Event情報を受けて、すぐさまWEB CLIENT画面(MS-IE)にエラーメッセージを出したいんです。

    Web(HTTP)でやっている限り、無理です。

     

    Win32のEventやSendMessage等の仕組みは1つのマシン上での話ですので、Webサーバー・クライアント間の通知には使えません。

    また、HTTPは基本的にクライアントが要求して、サーバーが応答を返す仕組みです。

    サーバー側からクライアント側に自発的に送信することは基本的にありません。

    (ASP.NETとかは触っていないので、その辺でうまい仕組みがあるのなら分かりませんが、ないだろうと認識してます。)

     

    そもそも、HTTPサーバーにあまり要求を出して欲しくないという状況が好ましくありません。

    HTTPの応答するサーバーと処理を行うサーバーの分割も検討すべきかもしれません。

    2008年4月30日 7:54
    モデレータ
  • できるだけすぐにという用途だと、そもそもWebでの通知が無理です。SNMPとか、syslogをsyslogdに投げるといった方法を使うしかないでしょう。

     

    Webコンソールだと大体10~30秒間隔のリフレッシュじゃないでしょうか。CPUの使用率が常時100%ってすごいですね。どういうものかはわかりませんが、静的なhtmlを受信するだけなら本来のタスクに影響があるほど性能低下するとも思えませんが...。

     

    とはいっても、実測されてみたら良いのではないでしょうか。

    2008年5月1日 1:21
  • どうしてもWebブラウザ上でのエラー表示にこだわるのであれば、発生したエラーをエラーログとしてテキストファイルなり、HTMLファイルになりに書き出して、そのファイルを定期的に読み込むJavaScriptを書いたHTMLファイルをブラウザに表示させるとかしか、方法がないんじゃないですかね。そしてこれらの読み込みはHTTPサーバーを経由せずに、ファイル共有ベースにすること。

     

    そのおっしゃっているリアルタイム性ですがブラウザを使っている時点でミリ秒を争うようなものでないんでしょうし、むしろログ側に正確なタイムスタンプが残ることの方が重要だと思うんですよね。そういう視点だとこの方法が良いんじゃないでしょうか。

     

    なんにせよ、そのCPU100%のタスクを何とかしないとログもうまく作れない、確認できないような気がしますが。

     

     

     

    2008年5月1日 23:54

すべての返信

  • まさにEventというオブジェクトがあるので、それと共有メモリとかですかね。

    CreateEvent http://msdn2.microsoft.com/en-us/library/ms682396(VS.85).aspx

    他にもパイプとか、WinSock使うとか、伝統的なWindow Message(RegisterWindowMessageで独自メッセージを作る)使うとか、要件に応じていろいろ方法はあります。

    2008年4月26日 10:54
  •  KKamegawa さんからの引用
    まさにEventというオブジェクトがあるので、それと共有メモリとかですかね。

    CreateEvent http://msdn2.microsoft.com/en-us/library/ms682396(VS.85).aspx

    他にもパイプとか、WinSock使うとか、伝統的なWindow Message(RegisterWindowMessageで独自メッセージを作る)使うとか、要件に応じていろいろ方法はあります。

     

    ご教示ありがとうございます。

    Eventを送る側のAPと、Eventを受信する側のAP共に自作の場合は何とかなりそうです。

     

    一方、MS-IE6,MS-IE7をEventを受けるAPとした場合、

     

    ・自作APが、MS-IE6、MS-IE7へEventを送信するのは可能か否か。

     可能であればその方法の概要はどうなるでしょうか。

     

    ・MS-IE6,7が他APからEventを受信できるか否か。

     可能ならば、どのようなEvent受信方法がとれるでしょうか。

     

    以上、ご存知でしたらご教示願います。

     

    2008年4月29日 2:12
  • 「何をしたいか」によると思います。

    全てのパターンでできるかと問われれば、「多分無理でしょう」という回答にならざる得ません。

    どのようなことを実現したいのか、もう少し具体的な例を示した方が、回答を得やすいと思います。

     

    ところで、「Eventを送る」と書かれていますが、これは「メッセージ」じゃないですか?

    PostMessage, SendMessage等で扱うものは「メッセージ」と呼び、Eventではありません。

    (広い意味でのEventであれば含むかと思いますが、Win32APIベースの話では含まないと考えます)

     

    独り言

    APと言われるとAccess Point、Win32APと言われるとWin32APIを思い浮かべるなぁ。

    Application→Appという認識なのはMFC(CWinApp)の影響かしら…。
    2008年4月29日 6:42
    モデレータ
  • うーん、どういうことをやられたいのか今一つ見えませんが…。

     

    極端な話、ローカルでIIS(httpサーバ)を動かして、アプリケーションAからmetaタグにrefreshを指定して、一定間隔で読み込むhtmlを吐き出して、IE側ではそれを読ませたって、立派なイベント通知なわけですし。

     

    2008年4月29日 16:37
  •  KKamegawa さんからの引用

    うーん、どういうことをやられたいのか今一つ見えませんが…。

     

    極端な話、ローカルでIIS(httpサーバ)を動かして、アプリケーションAからmetaタグにrefreshを指定して、一定間隔で読み込むhtmlを吐き出して、IE側ではそれを読ませたって、立派なイベント通知なわけですし。

     

     

    はい問題はそこのrefresh間隔なんです。

    WEBサーバの載ってる装置はWEB処理じゃないメインタスクが極めて忙しくてCPU利用率100%くらいで

    動いていてあまりWEB CLIENTに応答する時間をとられたくないんです。

     

    WEB CLIENTが頻繁にGETをWEBサーバに出されては忙しさゆえ困るという状況で

    メインタスクにエラー(イベント)が発生したとします。

    これを出来るだけ高速にWEB CLIENTで知りたいとしたとき、

    Event driven というか割り込みという感じでWEBサーバのマシンから

    Event情報を受けて、すぐさまWEB CLIENT画面(MS-IE)にエラーメッセージを出したいんです。

     

    あえてぼかして書いてますがこんな感じでやりたいことがわかるでしょうか。

     

     

     

    2008年4月30日 7:19
  •  dimension さんからの引用

    Event driven というか割り込みという感じでWEBサーバのマシンから

    Event情報を受けて、すぐさまWEB CLIENT画面(MS-IE)にエラーメッセージを出したいんです。

    Web(HTTP)でやっている限り、無理です。

     

    Win32のEventやSendMessage等の仕組みは1つのマシン上での話ですので、Webサーバー・クライアント間の通知には使えません。

    また、HTTPは基本的にクライアントが要求して、サーバーが応答を返す仕組みです。

    サーバー側からクライアント側に自発的に送信することは基本的にありません。

    (ASP.NETとかは触っていないので、その辺でうまい仕組みがあるのなら分かりませんが、ないだろうと認識してます。)

     

    そもそも、HTTPサーバーにあまり要求を出して欲しくないという状況が好ましくありません。

    HTTPの応答するサーバーと処理を行うサーバーの分割も検討すべきかもしれません。

    2008年4月30日 7:54
    モデレータ
  • できるだけすぐにという用途だと、そもそもWebでの通知が無理です。SNMPとか、syslogをsyslogdに投げるといった方法を使うしかないでしょう。

     

    Webコンソールだと大体10~30秒間隔のリフレッシュじゃないでしょうか。CPUの使用率が常時100%ってすごいですね。どういうものかはわかりませんが、静的なhtmlを受信するだけなら本来のタスクに影響があるほど性能低下するとも思えませんが...。

     

    とはいっても、実測されてみたら良いのではないでしょうか。

    2008年5月1日 1:21
  • どうしてもWebブラウザ上でのエラー表示にこだわるのであれば、発生したエラーをエラーログとしてテキストファイルなり、HTMLファイルになりに書き出して、そのファイルを定期的に読み込むJavaScriptを書いたHTMLファイルをブラウザに表示させるとかしか、方法がないんじゃないですかね。そしてこれらの読み込みはHTTPサーバーを経由せずに、ファイル共有ベースにすること。

     

    そのおっしゃっているリアルタイム性ですがブラウザを使っている時点でミリ秒を争うようなものでないんでしょうし、むしろログ側に正確なタイムスタンプが残ることの方が重要だと思うんですよね。そういう視点だとこの方法が良いんじゃないでしょうか。

     

    なんにせよ、そのCPU100%のタスクを何とかしないとログもうまく作れない、確認できないような気がしますが。

     

     

     

    2008年5月1日 23:54
  • こんにちは、フォーラムオペレータ大久保です。

     

    dimension さん、フォーラムのご利用ありがとうございます。

    本件、その後いかがでしょうか?皆様からのアドバイスは参考になりましたでしょうか。

     

    非常に興味深いスレッドですので、アドバイスをくださった皆様の投稿に「回答済み」チェックをつけさせていただきました。

    dimension さんの意図にそぐわないようでしたら、チェックを解除することもできますのでご確認ください。

     

    アドバイスをくださった皆様、ありがとうございました!

     

    2008年6月18日 5:04