本人在使用文件操作函数CreateFile有问题(偶尔发生,频率不高),望高手分析一下。具体代码如下:(主要实现写文件功能,被多个线程调用,封装成一个函数)         ::WaitForSingleObject(HLogMutex,INFINITE);
h_logfile=CreateFile(
"..\\logdata\\logdata.com",
GENERIC_WRITE,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL
);
dwError = GetLastError();
          if(INVALID_HANDLE_VALUE==h_logfile)
{
CString str;
str.Format("log handle is invalid %d",dwError);
AfxMessageBox(str);
}         ……         DWORD bResult=WriteFile(  h_logfile, 
log_str, 
logstr_len,  
&NumberOfBytesWrite, 
NULL    
);
if(h_logfile!=INVALID_HANDLE_VALUE)
{
DWORD CHerr=CloseHandle(h_logfile);
if(0==CHerr)
{
dwError = GetLastError();
CString str;
str.Format("close handle is fail. the errcode is %d",dwError);
AfxMessageBox(str);
}
}
::ReleaseMutex(HLogMutex);长期运行后,会发生问题“log handle is invalid 32”,即文件访问冲突(正被另一进程使用),但CloseHandle没有发生错误(没有报错,应该都成功了)。访问冲突的具体原因是什么呢?疑惑ing……

解决方案 »

  1.   

    if(INVALID_HANDLE_VALUE==h_logfile)
    {
    CString str;
    str.Format("log handle is invalid %d",dwError);
    AfxMessageBox(str);                  //add  
                      return;
    }
      

  2.   

    我已经用了mutex进行互斥访问文件,但是还是存在问题。::WaitForSingleObject(HLogMutex,INFINITE);……
    ::ReleaseMutex(HLogMutex);
      

  3.   

    你的Closehandle用的时候别的进程已经进入了
      

  4.   

    用fopen,fwrite,fread 操作文件
      

  5.   

    Closehandle已经放在互斥体里面了,具体见上面的代码
      

  6.   

    你能不能在写文件的后面加一个延时,保证在同一时间只有一个线程在调用写函数;
    我只是在操作与硬件有关的程序时,才发现这样的bug
    祝你好运!
      

  7.   

    在同一时间只有一个线程在调用写函数这样不容易保证,我想实现即使是多个线程在调用,也能保证串行访问文件。
    谢谢你,qj7979(qj)。
      

  8.   

    是否调用过于频繁,如果这样Windows有可能出问题,不如做成只CreateFile一次
      

  9.   

    是的,调用的确比较频繁。因为我想为系统创建日志文件,在调试时,考虑了最坏的情况测试系统的稳定性。但是出现了问题,而且也不好保证在一个时刻只有一个线程在调用写日志 函数,但我使用了互斥体却没有实现理想的效果。疑惑ing……