• ベストアンサー

CreateFile、CloseHandleの繰り返しで戻りが遅くなる

CreateFile、CloseHandleを繰り返し使用していると、CreateFileの戻りが極端に遅くなる(数秒)現象がありました。原因および対処方法を教えてください。お願いします。(WindowsXP SP2、VC.NET)

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答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の実行時間を測定すればハッキリするかと思います。

asa5han
質問者

お礼

ありがとうございます。早速試してみます。 本当にありがとうございました。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

現象を再現させる最小限の大きさのサンプルコードがあれば、適切な回答がつきやすいかと思います。サンプルコードを出していただくことは可能でしょうか。(サンプルコードなしでは、適切な回答は得られないでしょう。)

asa5han
質問者

補足

対応していただきありがとうございます。 以下がサンプルコードです。 省略しましたが、全てのコード前後に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

専門家に質問してみよう