关于文件操作函数CreateFile的问题

comman_wang 2003-11-11 02:28:56
本人在使用文件操作函数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……
...全文
61 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
comman_wang 2003-11-17
  • 打赏
  • 举报
回复
up
comman_wang 2003-11-14
  • 打赏
  • 举报
回复
问题还是没有解决,希望大家能帮忙分析一下,谢谢
comman_wang 2003-11-13
  • 打赏
  • 举报
回复
是的,调用的确比较频繁。因为我想为系统创建日志文件,在调试时,考虑了最坏的情况测试系统的稳定性。但是出现了问题,而且也不好保证在一个时刻只有一个线程在调用写日志 函数,但我使用了互斥体却没有实现理想的效果。疑惑ing……
crazysoft 2003-11-12
  • 打赏
  • 举报
回复
是否调用过于频繁,如果这样Windows有可能出问题,不如做成只CreateFile一次
ablefirst 2003-11-12
  • 打赏
  • 举报
回复
把Closehandle放在互斥体中。
flinming 2003-11-12
  • 打赏
  • 举报
回复
用fopen,fwrite,fread 操作文件。。。。。。。。。
yintongshun 2003-11-12
  • 打赏
  • 举报
回复
你的Closehandle用的时候别的进程已经进入了
comman_wang 2003-11-12
  • 打赏
  • 举报
回复
up一下,希望各位帮忙分析一下,谢谢
comman_wang 2003-11-12
  • 打赏
  • 举报
回复
在同一时间只有一个线程在调用写函数这样不容易保证,我想实现即使是多个线程在调用,也能保证串行访问文件。
谢谢你,qj7979(qj)。
qj7979 2003-11-12
  • 打赏
  • 举报
回复
你能不能在写文件的后面加一个延时,保证在同一时间只有一个线程在调用写函数;
我只是在操作与硬件有关的程序时,才发现这样的bug
祝你好运!
comman_wang 2003-11-12
  • 打赏
  • 举报
回复
Closehandle已经放在互斥体里面了,具体见上面的代码


comman_wang 2003-11-11
  • 打赏
  • 举报
回复
我已经用了mutex进行互斥访问文件,但是还是存在问题。

::WaitForSingleObject(HLogMutex,INFINITE);

……
::ReleaseMutex(HLogMutex);


3jaja 2003-11-11
  • 打赏
  • 举报
回复
“主要实现写文件功能,被多个线程调用,封装成一个函数.”
一个线程仍在写,而另一个线程又在打开,所以出错。
comman_wang 2003-11-11
  • 打赏
  • 举报
回复
但这样会造成信息的丢失,而且我也不明白文件访问冲突的具体原因,很希望能发现具体的原因。
3jaja 2003-11-11
  • 打赏
  • 举报
回复
if(INVALID_HANDLE_VALUE==h_logfile)
{
CString str;
str.Format("log handle is invalid %d",dwError);
AfxMessageBox(str);

//add
return;
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧