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

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

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

Re[4]: CloseHandleのタイミング


(過去ログ 78 を表示中)

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

■46167 / inTopicNo.1)  CloseHandleのタイミング
  
□投稿者/ ぴーちゃん (4回)-(2010/01/27(Wed) 13:14:57)

分類:[.NET 全般] 

タイトルが文字数制限に引っ掛かってしまいました・・・^^;

Win32 API のCreateFileMappingを使って、メモリマップドファイルを
作成した際の、送信側のCloseHandleのタイミングについて教えてください。

現在のCloseHandleするまでの流れは、次のようになっています。
    
    //作成
	HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
					    PAGE_READWRITE, 0, sizeof(MESSAGE), TEXT("C_VB_MEMORY_SHARED")); 
	if(hMapping == NULL){
		MessageBox(NULL,TEXT("CreateFileMapping NULL"),TEXT("DEBUG"),MB_OK);
		return;
	}
    //アドレス取得
	p_msg = (MESSAGE *) MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);

	if(p_msg == NULL){
		MessageBox(NULL,TEXT("MapViewOfFile1 NULL"),TEXT("DEBUG"),MB_OK);
		return;
	}
    //データセット
	memset(&msg,NULL,sizeof(MESSAGE));
	msg.m_len = strlen(p);
	memcpy(msg.m_message,p,strlen(p));
    //メモリマップドファイルへの書き込み
	memcpy(p_msg,&msg,sizeof(MESSAGE));
    //相手に教える
        if(PostMessage(SendWnd,SEND_MESSAGE,0,0)==0){
		MessageBox(NULL,TEXT("PostMessage FALSE"),TEXT("DEBUG"),MB_OK);    
         }
    //リソースの解放
	UnmapViewOfFile(p_msg);
	CloseHandle(hMapping);


分類は、.NET全般で大丈夫ですかね??

引用返信 編集キー/
■46168 / inTopicNo.2)  Re[1]: CloseHandleのタイミング
□投稿者/ .SHO (1166回)-(2010/01/27(Wed) 13:20:09)
PostMessage()じゃなくてSendMessage()を使えば
このままでいいです。

引用返信 編集キー/
■46169 / inTopicNo.3)  Re[1]: CloseHandleのタイミング
□投稿者/ ぴーちゃん (5回)-(2010/01/27(Wed) 13:22:50)
肝心の問題を書き忘れてしまいました。
問題は相手がOpenFileMappingする際に、NULLが帰ってくることです。
GetLastErrorには 2 が帰ってきました。 

”ERROR_FILE_NOT_FOUND 2 0x00000002 指定されたファイルが見つかりません。”

だそうです。CloseHandleをコメントアウトすると、OpenFileMappingはメモリマップドファイルのハンドルを返してくれるのですが、、
引用返信 編集キー/
■46170 / inTopicNo.4)  Re[2]: CloseHandleのタイミング
□投稿者/ ぴーちゃん (6回)-(2010/01/27(Wed) 13:27:11)
No46168 (.SHO さん) に返信
> PostMessage()じゃなくてSendMessage()を使えば
> このままでいいです。
>
ありがとうございます。
SendMessageですか。たしか同期がとれてる関数なんですよね?
同期がとれてるっていうことは相手がメッセージを取得するまで制御が戻ってこないということですよね?
それはアプリ的にまずいかも・・・
非同期で実現するには、やはりコードを書きなおさなければならないんですね。。
ありがとうございました。

引用返信 編集キー/
■46172 / inTopicNo.5)  Re[3]: CloseHandleのタイミング
□投稿者/ .SHO (1168回)-(2010/01/27(Wed) 13:32:52)
> 同期がとれてるっていうことは相手がメッセージを取得するまで制御が戻ってこないということですよね?
> それはアプリ的にまずいかも・・・

でしたら、相手がメッセージを取得したことを、逆にPostMessage()してもらって
そのタイミングでCloseHandle()するしかないです。

引用返信 編集キー/
■46173 / inTopicNo.6)  Re[2]: CloseHandleのタイミング
□投稿者/ とっちゃん (455回)-(2010/01/27(Wed) 13:36:12)
とっちゃん さんの Web サイト
No46169 (ぴーちゃん さん) に返信
> 肝心の問題を書き忘れてしまいました。
> 問題は相手がOpenFileMappingする際に、NULLが帰ってくることです。
> GetLastErrorには 2 が帰ってきました。 
>
> ”ERROR_FILE_NOT_FOUND 2 0x00000002 指定されたファイルが見つかりません。”
>
> だそうです。CloseHandleをコメントアウトすると、OpenFileMappingはメモリマップドファイルのハンドルを返してくれるのですが、、

直接的な原因は
CreateFileMapping(INVALID_HANDLE_VALUE...
ですね。
実在ファイルを指定せずにマッピングオブジェクトを作っているため、
そのハンドルをクローズしたら、名前参照してるものがなくなるため、そのオブジェクトを開けなくなります。

PostMessageからSendに変えてうまくいくのはそのあたりが原因です。

何度もやり取りするので...ということであれば、あらかじめCreateFileMapping する関数と CloseHandle する関数を用意しておいて
アプリの起動時(か初めて処理する時)に CreateFileMapping する関数を呼び、アプリの終了時に CloseHanlde する関数を呼べばいいと思いますよ。

非同期の必要性があるのであれば。

引用返信 編集キー/
■46175 / inTopicNo.7)  Re[3]: CloseHandleのタイミング
□投稿者/ とっちゃん (456回)-(2010/01/27(Wed) 13:39:37)
とっちゃん さんの Web サイト
No46173 (とっちゃん さん) に返信
訂正。。。

実在ファイルを使っているかいないかにかかわりなく、
CreateFileMapping した後、一度も OpenFileMapping などされずに CloseHandle されたらその時点で
名前付きのハンドルは消失します。

誰も参照していないんですから。

このあたりは、イベントハンドルなんかと同じです。ま、名前を付けられるカーネルハンドルは皆一緒ですがw

引用返信 編集キー/
■46184 / inTopicNo.8)  Re[4]: CloseHandleのタイミング
□投稿者/ ぴーちゃん (7回)-(2010/01/27(Wed) 16:50:21)
No46172 (.SHO さん) に返信
>>同期がとれてるっていうことは相手がメッセージを取得するまで制御が戻ってこないということですよね?
>>それはアプリ的にまずいかも・・・
>
> でしたら、相手がメッセージを取得したことを、逆にPostMessage()してもらって
> そのタイミングでCloseHandle()するしかないです。
>
なるほど。
やはり相手との疎通が出来てないと、難しいってことですね・・・
コードを書きなおそうかと思っています。
レスが遅くなり失礼いたしました。
ありがとうございます^^

解決済み
引用返信 編集キー/
■46185 / inTopicNo.9)  Re[3]: CloseHandleのタイミング
□投稿者/ ぴーちゃん (8回)-(2010/01/27(Wed) 16:54:13)
No46173 (とっちゃん さん) に返信

> 直接的な原因は
> CreateFileMapping(INVALID_HANDLE_VALUE...
> ですね。
> 実在ファイルを指定せずにマッピングオブジェクトを作っているため、
> そのハンドルをクローズしたら、名前参照してるものがなくなるため、そのオブジェクトを開けなくなります。
>
> PostMessageからSendに変えてうまくいくのはそのあたりが原因です。
>
> 何度もやり取りするので...ということであれば、あらかじめCreateFileMapping する関数と CloseHandle する関数を用意しておいて
> アプリの起動時(か初めて処理する時)に CreateFileMapping する関数を呼び、アプリの終了時に CloseHanlde する関数を呼べばいいと思いますよ。
>
> 非同期の必要性があるのであれば。
>
それで行きたいと思います。
アプリの開始時にCreateFileMapping して、アプリの終了時にCloseHandleします。
レスが遅くなり申し訳ありません・・・
どうもありがとうございました^^

そしてCreateFileMappingでは実ファイルも指定できるのですね・・・
知りませんでした。勉強になります。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -