线程中为何一调用文件IO就会出错?

fossil2000 2009-10-16 01:18:36
为何一调用文件的IO就会出错呢,这个文件没有共享的问题,只有这一个线程打开??通过debug进入发现只要一调用有IO的就会出错。大虾们,救救我。
错误提示是:
Debug Assertion Failed!

Program: E:\MulThread\Debug\MulThread.exe
File: wincore.cpp
Line: 991

源代码:
UINT CMulThreadDlg::WriteThread(LPVOID pParam)
{
CMulThreadDlg* pDlg=(CMulThreadDlg*)pParam;
PressD pt;
CStdioFile file1;
char str[20];
while(pDlg->flag)
{
file1.Open("c:\\1.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
file1.SeekToEnd();
while(!pDlg->Pq.empty())
{
pt=pDlg->Pq.front();pDlg->Pq.pop();
for(int i=0;i<10;i++)
{
sprintf(str,"%lf",pt.GetiD(i));
str[19]='\0';
file1.WriteString((LPCTSTR)str); //只要有写入或读的IO操作就会出错。。
file1.WriteString(",");
}
file1.WriteString("\n");
file1.Close();

}
Sleep(1000);
}
return 0;
}


线程调用方法:
AfxBeginThread(WriteThread,(LPVOID)this);
...全文
197 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-10-28
  • 打赏
  • 举报
回复
这个检查其实在CWnd里到处有,不一定是DestroyWindow里的,楼上是被下面这句误导了:
989: // Should have been detached by OnNcDestroy
[Quote=引用 15 楼 gg606 的回复:]
写文件怎么会导致 DestroyWindow() 被调用呢?这个问题值得思考

[/Quote]
arong1234 2009-10-28
  • 打赏
  • 举报
回复
这个其实和IO没多少关系,楼主应该看看call stack,看看在什么地方使用了窗口的东西。
arong1234 2009-10-28
  • 打赏
  • 举报
回复
gg606 2009-10-28
  • 打赏
  • 举报
回复
写文件怎么会导致 DestroyWindow() 被调用呢?这个问题值得思考
lkldiy 2009-10-28
  • 打赏
  • 举报
回复

BOOL CWnd::DestroyWindow()
{
if (m_hWnd == NULL)
return FALSE;

CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);
CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
#ifdef _DEBUG
HWND hWndOrig = m_hWnd;
#endif

#ifdef _AFX_NO_OCC_SUPPORT
BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd);
else
bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT

// Note that 'this' may have been deleted at this point,
// (but only if pWnd != NULL)
if (pWnd != NULL)
{
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL); //这个断言
#endif
}
else
{
#ifdef _DEBUG
ASSERT(m_hWnd == hWndOrig);
#endif
// Detach after DestroyWindow called just in case
Detach();
}
return bResult;
}


你循环的时候有窗口销毁了,你把断点打在DestroyWindow()的开始地方,调试进断点的时候看看堆栈,应该是别的地方有问题
Conry 2009-10-28
  • 打赏
  • 举报
回复
改成CFile试试吧
fossil2000 2009-10-26
  • 打赏
  • 举报
回复
kingstarer兄所言及是,你指出的这个问题,确实是一个问题这个地方不应当在不恰当的地方关文件,
我已经将这一句提了出来。
但是我所标的那一句的问题依旧。
file1.WriteString((LPCTSTR)str); //只要有写入或读的IO操作就会出错。。

另:gg606兄所提到的WinCore.cpp的991行错误相关代码如下:
987: if (pWnd != NULL)
988: {
989: // Should have been detached by OnNcDestroy
990:#ifdef _DEBUG
991: ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);
992:#endif
这个文件的路径在:
D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
我所用的编译器是VC++6.0,
leopardaa521 2009-10-25
  • 打赏
  • 举报
回复
mark
很土 2009-10-25
  • 打赏
  • 举报
回复
工程配置问题,请选择MultiThreads选项。
kingstarer 2009-10-24
  • 打赏
  • 举报
回复

UINT CMulThreadDlg::WriteThread(LPVOID pParam)
{
CMulThreadDlg* pDlg=(CMulThreadDlg*)pParam;
PressD pt;
CStdioFile file1;
char str[20];
while(pDlg->flag)
{
file1.Open("c:\\1.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
file1.SeekToEnd();

while(!pDlg->Pq.empty())
{
pt=pDlg->Pq.front();pDlg->Pq.pop();
for(int i=0;i <10;i++)
{
sprintf(str,"%lf",pt.GetiD(i));
str[19]='\0';
file1.WriteString((LPCTSTR)str); //只要有写入或读的IO操作就会出错。。
file1.WriteString(",");
}
file1.WriteString("\n");
//file1.Close();//这行代码需要提到循环外面 
}
file1.Close(); //换位置
Sleep(1000);
}
return 0;
}
gg606 2009-10-24
  • 打赏
  • 举报
回复

File: wincore.cpp
Line: 991

出错的代码及其上下文贴出来看看,不知你什么版本
fossil2000 2009-10-24
  • 打赏
  • 举报
回复
我晕。没有人回答了吗?
fossil2000 2009-10-19
  • 打赏
  • 举报
回复
回楼上的gg606,
while(pDlg->flag)
{
while(!pDlg->Pq.empty())
这里面的flag是view类里的一个状态标志,用于控制线程停止或继续的。
Pq是一个队列对象,empty是一个测试队列中是否还有值的,它的申明来自于队列模版std::queue。
经过好几次的调试,程序在这几句里没有任何错误提示,而且通过内存查看其数据均是正常的,
但程序每次运行到下面的一句时总会有错,这一句正是开始对文件的写操作的开始。。。。。file1.WriteString((LPCTSTR)str); //只要有写入或读的IO操作就会出错。。
xuximail 2009-10-18
  • 打赏
  • 举报
回复
单步调试 看看str里面值有么有赋值正确嘛
gg606 2009-10-18
  • 打赏
  • 举报
回复
估计问题不在IO,
而在于下面这些地方:
while(pDlg->flag)
{
while(!pDlg->Pq.empty())
fossil2000 2009-10-18
  • 打赏
  • 举报
回复
单步进去过。str里面的值是正确的从double转过的值,为了怕没有结束符,我在写放之前,还做了一个str[19]='\0'给了一个强制的字符结束符,但只要写就有问题。
后来用RELEASE方式调试,没有了错误。但我想搞清楚,为何debug总有错。
错误提示在贴子开始就给了出来。
谢谢各位的指点。
chenyu2202863 2009-10-16
  • 打赏
  • 举报
回复
跟踪啥~
具体出什么错
fan-james 2009-10-16
  • 打赏
  • 举报
回复
最好是检查一下file1.WriteString((LPCTSTR)str);中的(LPCTSTR)str,可能根本就没有值的,所以报错。
fossil2000 2009-10-16
  • 打赏
  • 举报
回复
没人吗???帮帮我。

15,471

社区成员

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

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