No.2ベストアンサー
- 回答日時:
補足いただいたサンプルを若干書き換えて、以下のコードで試してみました。
CreateFileとCloseHandleの実行時間を簡易的に測定し、実行完了時にその最大値をミリ秒単位で表示するようになっています。void CmfctestDlg::OnBnClickedButton1()
{
DWORD dwCreateFile = 0;
DWORD dwCloseHandle = 0;
HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
int i;
for (i = 0; i < 10000; ++i) {
WaitForSingleObject(hMutex, INFINITE);
DWORD dw1 = GetTickCount();
HANDLE hFile = CreateFile(
"c:\\tmp\\test.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
0
);
if (hFile == INVALID_HANDLE_VALUE) {
MessageBox("ouch!");
break;
}
DWORD dw2 = GetTickCount();
CloseHandle(hFile);
DWORD dw3 = GetTickCount();
ReleaseMutex(hMutex);
if (dw2 - dw1 > dwCreateFile) {
dwCreateFile = dw2 - dw1;
}
if (dw3 - dw2 > dwCloseHandle) {
dwCloseHandle = dw3 - dw2;
}
}
CString s;
s.Format("CreateFile %d, CloseHandle %d", dwCreateFile, dwCloseHandle);
MessageBox(s);
}
手抜きのためMFCを使ったのでMessageBoxとかCStringのあたりがナントモですが、大意は変わっていないかと思います。
これをWindows XP Professional SP2とWindows 2000 Professional SP4の上で動かしてみましたが、いずれもCreateFile, CloseHandleの実行時間の最大値は10ms~20ms程度になりました。
数秒も遅れる可能性があるのはWaitForSingleObjectのほうが高いような気がしますが、「他スレッド」のほうでMutexを長期間掴んでいるという可能性はないでしょうか。これについても、上記と同様の方法でWaitForSingleObjectの実行時間を測定すればハッキリするかと思います。
No.1
- 回答日時:
現象を再現させる最小限の大きさのサンプルコードがあれば、適切な回答がつきやすいかと思います。
サンプルコードを出していただくことは可能でしょうか。(サンプルコードなしでは、適切な回答は得られないでしょう。)この回答への補足
対応していただきありがとうございます。
以下がサンプルコードです。
省略しましたが、全てのコード前後にprintf()を入れてます。
CreateFile()の戻りが数秒遅れることがあるのは確かだと思われます。
どうかよろしくお願いいたします。
// CreateMutex()、ファイル新規作成は省略
for ( i = 0; i < 10000; i++ )
{
// 他スレッドとの排他のためMutex使用
WaitForSingleObject(hMutex, INFINITE);
sfd = CreateFile("fileName",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
CloseHandle(sfd);
ReleaseMutex(hMutex);
Sleep(1000);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
CreateFile関数でCOMポートが開けない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA にて JavaScript の...
-
初心者です。gulpでコンパイル...
-
if(1){...}とはどういうことで...
-
CreateFile、CloseHandleの繰り...
-
JavaScriptでショートカットキ...
-
jQuery ui Datepicker 明日以降...
-
デザイン時のVisible=Falseは実...
-
CTRL + Xを無効にしたい
-
Excelのマクロ一括実行ができな...
-
resizeToメソッドが動作しません
-
JSPの処理の途中で、JavaScript...
-
条件に一致しない行を全て削除...
-
乱数の表示
-
onload onunload onbeforeunloa...
-
C#でボタン名を変更しても動く
-
VisualStudio2008の最適化について
-
リクエスト結果が一瞬しか表示...
-
VBAによる第3、4水準文字の判定...
-
jsでルートディレクトリより上...
-
VBScript から JavaScript を呼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
初心者です。gulpでコンパイル...
-
if(1){...}とはどういうことで...
-
C#でボタン名を変更しても動く
-
VBA ステータスバー DoEvents
-
デザイン時のVisible=Falseは実...
-
PowerPointで時計表示
-
〔Excel:VBA〕マクロの実行が異...
-
1つのVBAコードをすべてのコア...
-
既存のwebサイトで、ローカルの...
-
innerHTMLなどの反映タイミング
-
VBA SORT Applyでエラー
-
Excelのマクロ一括実行ができな...
-
resizeToメソッドが動作しません
-
JavaScriptでショートカットキ...
-
jQuery ui Datepicker 明日以降...
-
CTRL + Xを無効にしたい
-
アクセスのフォームでタイマー...
-
javascriptで最初のところに戻...
-
リクエスト結果が一瞬しか表示...
おすすめ情報