
アプリケーションAで得た情報をアプリケーションBに渡す方法としてメモリマップドファイルの使用を検討しています。
例えばアプリケーションAで、これのテキストボックスに数値をキー入力した場合、キーイベント内でメモリマップドファイルを生成してその数値を書き込みます。
アプリケーションBではこれのボタンを押されるとそのイベント内でメモリマップドファイルの有無を確認し、存在していればアプリケーションAで入力された数値を表示すると言った感じです。
しかし、実際にやってみますとアプリケーションAで生成したファイルはキーイベントから抜けた時点で消滅してしまう様で、アプリケーションB側から見ると常にファイルが存在しない状態になっています。
アプリケーションAのフォームを閉じない限りファイルを残したままにしたいのですが、どの様にすれば良いのかお教え頂けないでしょうか。
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
usingステートメントは理解されていますか?
アプリケーションAで
> using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("myMemmapFile", 10000))
> {
とありますが、usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。
KeyUpイベントハンドラ中で、作成→破棄されているわけです。
アプリケーションAのフォームのコンストラクタでメモリマップドファイルを作成し、フィールド変数でフォームが生きている間保持していれば、ひとまず問題は解決すると思われます。
再度の回答、有り難うございました。
>usingステートメントは続くブロックを抜ける時mmfのオブジェクトのdisposeメソッドを呼んで破棄します。
>
なるほど、そう言うことだったんですかぁ。 よく分かりました。 ネットから拾ったソースを自分なりに解釈して使っていたんですが、理解できていませんでした。
助言頂いた様にすると期待通りの動きとなりました。 1週間以上ネットで調べたのですが解決できず、落胆していたのでとっても嬉しいです!本当に感謝しています。
No.1
- 回答日時:
ソースがわからないので何とも言えませんが、イベントハンドラのどこかでメモリマップドファイルを閉じてしまっているのでは?
少なくともアプリケーションBがその数値の読み取りを必要としている限り、メモリマップドファイルを閉じてはなりません。
単純な方法としては、アプリケーションAがフォームを開いている間は常にメモリマップドファイルを開いている状態しておけばよいのではないでしょうか。
早速の回答、有り難うございます。
ネットからの情報を基に試行錯誤しており、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";
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Microsoft ASP Windows10エンタープライズ版をインストールしたらアプリが使えなくなった 3 2023/03/07 11:08
- ネットワーク クラウド環境の範囲について教えてください。 7 2023/03/09 15:50
- Windows 10 ノートPCをスリープにするとアプリが閉じてしまう。 3 2022/04/14 18:33
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- Mac OS 動画ファイルの画質比較アプリ (Mac) 1 2023/07/14 19:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
IISワーカープロセスが原因でCP...
-
[VB.2005]クライアントからWEB...
-
帳票出力について
-
AccessとVBの違いについて
-
Javaセキュリティによってブロ...
-
unzip32.dllの利用について(64b...
-
JSPファイルで生じるエラーをど...
-
CSSとCGIの勉強がしたいです。
-
MSFormsとは何ですか?
-
C++勉強
-
Javascriptで出来ること
-
UnknownHostException
-
EclipseでJavaコンパイラのバー...
-
javaのジェネリックスでTとEの...
-
正規表現について質問です。 カ...
-
【javaコンパイル時のエラーに...
-
CrystalReportsのバージョン確...
-
ゲームコントローラーを使いたい
-
Javaでの三目並べのソースコード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
IISワーカープロセスが原因でCP...
-
unzip32.dllの利用について(64b...
-
プラグインとパッチの違いは?
-
JAVAプログラムをWEB表示させる...
-
C#のメモリマップドファイルに...
-
java起動時の日本語引数文字化...
-
SurfaceViewの一時停止や再開方法
-
JAVAアプレットとか。
-
AccessとVBの違いについて
-
JAVAのオススメ本
-
予約システムの開発ツール
-
プログラミングの『C♯』で作れ...
-
帳票出力について
-
java oneって?
-
アプレットからアプリケーショ...
-
JVM(JRE)の再配布?について。
-
Javaセキュリティによってブロ...
-
javaでアプリケーションを作りたい
-
RTT計測
おすすめ情報