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で質問しましょう!
似たような質問が見つかりました
- デジタルカメラ 一眼レフ撮影画像の上端の一部が明るいです 2 2023/08/20 11:44
- 発達障害・ダウン症・自閉症 仕事に行く前に吐き気がする事があります、対処法は? 8 2022/09/27 16:47
- Mac OS 編集画面のプレビューについて 1 2022/05/18 11:39
- FTTH・光回線 ネットをニューロ光にしたのですが、度々、接続が切れます。 onu再起動すると、暫くは760~1Gmは 1 2022/03/25 23:48
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- 眼・耳鼻咽喉の病気 私は何故か去年の10月頃から副鼻腔炎を繰り返してます。 頻度としては早くて1ヶ月、遅くても3ヶ月で治 1 2023/05/16 16:58
- Android Xperia 10 IVが定期的に再起動するのはメモリ(RAM)が原因ですか? あとなぜ本体設定に( 1 2023/02/01 00:01
- モニター・ディスプレイ パソコンのディスプレイがスリープを短時間繰り返す 3 2022/07/15 09:19
- ノートパソコン ノートパソコンの起動が極端に遅いのはどうしたら良いでしょうか 19 2023/04/08 16:54
- モニター・ディスプレイ デュアルディスプレイ環境で、メインモニターが暗転を繰り返すことがあります。 OS:win10 GPU 1 2022/08/02 12:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA にて JavaScript の...
-
ラベルの色がかわってくれない
-
時間稼ぎの命令文とは?
-
JSPの処理の途中で、JavaScript...
-
計算結果が毎回違う。
-
リクエスト結果が一瞬しか表示...
-
C#でボタン名を変更しても動く
-
2回目のSortメソッドが失敗~20...
-
jspで、javaを呼び出すときの引...
-
オーバーライドについて。
-
jqueryのbxsliderをマウスオー...
-
VBA ステータスバー DoEvents
-
初心者です。gulpでコンパイル...
-
VB.netの重複データ数カウント...
-
jQuery ui Datepicker 明日以降...
-
if(1){...}とはどういうことで...
-
NB.netでのステップ実行
-
setTimeoutあるいはsetInterval...
-
GoTo文とかSelect文の処理の仕...
-
JavaScriptでショートカットキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if(1){...}とはどういうことで...
-
JSPの処理の途中で、JavaScript...
-
デザイン時のVisible=Falseは実...
-
1つのVBAコードをすべてのコア...
-
〔Excel:VBA〕マクロの実行が異...
-
以下のコードを実行しても、オ...
-
PowerPointで時計表示
-
C#でボタン名を変更しても動く
-
jQuery ui Datepicker 明日以降...
-
初心者です。gulpでコンパイル...
-
リクエスト結果が一瞬しか表示...
-
innerHTMLなどの反映タイミング
-
既存のwebサイトで、ローカルの...
-
JavaScriptで、実行するたび値...
-
VBA ステータスバー DoEvents
-
VBA SORT Applyでエラー
-
resizeToメソッドが動作しません
-
Excel VBA にて JavaScript の...
-
eval()の危険性の具体例を教え...
-
ラベルの色がかわってくれない
おすすめ情報