アプリ版:「スタンプのみでお礼する」機能のリリースについて

アプリケーションAで得た情報をアプリケーションBに渡す方法としてメモリマップドファイルの使用を検討しています。

例えばアプリケーションAで、これのテキストボックスに数値をキー入力した場合、キーイベント内でメモリマップドファイルを生成してその数値を書き込みます。

アプリケーションBではこれのボタンを押されるとそのイベント内でメモリマップドファイルの有無を確認し、存在していればアプリケーションAで入力された数値を表示すると言った感じです。

しかし、実際にやってみますとアプリケーションAで生成したファイルはキーイベントから抜けた時点で消滅してしまう様で、アプリケーションB側から見ると常にファイルが存在しない状態になっています。

アプリケーションAのフォームを閉じない限りファイルを残したままにしたいのですが、どの様にすれば良いのかお教え頂けないでしょうか。

宜しくお願いします。

A 回答 (2件)

usingステートメントは理解されていますか?



アプリケーションAで
>  using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("myMemmapFile", 10000))
>  {

とありますが、usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。
KeyUpイベントハンドラ中で、作成→破棄されているわけです。
アプリケーションAのフォームのコンストラクタでメモリマップドファイルを作成し、フィールド変数でフォームが生きている間保持していれば、ひとまず問題は解決すると思われます。
    • good
    • 0
この回答へのお礼

再度の回答、有り難うございました。

>usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。
>
なるほど、そう言うことだったんですかぁ。 よく分かりました。 ネットから拾ったソースを自分なりに解釈して使っていたんですが、理解できていませんでした。

助言頂いた様にすると期待通りの動きとなりました。 1週間以上ネットで調べたのですが解決できず、落胆していたのでとっても嬉しいです!本当に感謝しています。

お礼日時:2011/10/11 22:38

ソースがわからないので何とも言えませんが、イベントハンドラのどこかでメモリマップドファイルを閉じてしまっているのでは?


少なくともアプリケーションBがその数値の読み取りを必要としている限り、メモリマップドファイルを閉じてはなりません。
単純な方法としては、アプリケーションAがフォームを開いている間は常にメモリマップドファイルを開いている状態しておけばよいのではないでしょうか。
    • good
    • 0
この回答へのお礼

早速の回答、有り難うございます。

ネットからの情報を基に試行錯誤しており、100%理解できている訳ではないのですが、ソースは以下のとおりです。

ファイル読み出しは実際には1秒のタイマーイベントで行っています。
また、最初はMutexで同期を取っていましたが取り敢えず余計なものは削除してあります。(Mutexを入れても症状は同じです)

これらを走らせるとアプリケーションBで常に"Err"が表示されます。

デバッガでステップ実行させるとusing (var mmf = MemoryMappedFile.OpenExisting("myMemmapFile"))の次に例外が発生しています。

>少なくともアプリケーションBがその数値の読み取りを必要としている限り、メモリマップドファイル
>を閉じてはなりません。
>
ファイルは開いたままになっていると考えているのですが…。

修正点や確認事項などありましたらご指摘頂ければ有難いです。
どうぞ宜しくお願いします。


【アプリケーションA ファイル生成メソッド(キーイベント)】
private void txWrite0_KeyUp(object sender, KeyEventArgs e)
{
  using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("myMemmapFile", 10000))
  {
    using (var stream = mmf.CreateViewStream())
    using (StreamWriter sw = new StreamWriter(stream))
    {
      string s = txWrite0.Text;
      sw.WriteLine(s);
    }
  }
}

【アプリケーションB ファイル読み出しメソッド(タイマーイベント)】
private void Mmfdisp()
{
  try
  {
    using (var mmf = MemoryMappedFile.OpenExisting("myMemmapFile"))
    using (var stream = mmf.CreateViewStream())
    using (StreamReader sr = new StreamReader(stream))
    {
      string line = sr.ReadLine();
      txDisp.Text = line;
    }
    txError.Text = "";
  }
  catch
  {
    txError.Text = "Err";
  }
}

お礼日時:2011/10/11 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!