多线程读写access数据库导致死机,不知什么原因
我编写了一个下载WEB网页的程序,使用access2000数据库存储数据。
界面上提供几个按钮:
一个是刷新列表,需要从数据库表Article中读取记录;
另一个是启动下载线程,下载网页和内部相关的图片,分别保存到表:Article, ObjStorage中。
对于表的操作,已经使用了信号量:
在CWebApp中创建了CMutex m_Mutex(FALSE, NULL);
在CWebDlg中创建了CSingleLock sLock(&(theApp.m_Mutex));
在LoadRecords中读取记录并刷新CListCtrl
下载网页的时候,将启动一个线程static CWebDlg::ThreadProc,
线程中主要调用CReadWebPage类实现文章列表下载。
在CWebDlg中创建了CSingleLock sLock(&(theApp.m_Mutex));
CReadWebPage首先
下载栏目页面;
循环分析文章链接
{
然后下载文章内容
生成文章记录
循环分析包含的图片链接
{
下载图片文件
生成文章对应的图片记录
}
}
不管是显示函数中,还是下载函数中,对于记录集的操作都首先使用sLock.Lock();记录集合关闭后使用sLock.Unlock();
我在测试的时候,首先开始下载,然后不停地按刷新显示,经过不定长地时间,程序界面完全没有反应。
使用VC->Attach To Process,中断运行,看到地Call Stack中已经没有进程的调用显示了,比如:
NTDLL! 77f9323e()
USER32! 77df3990()
USER32! 77df3a5c()
MSJET40! 1b10f86e()
104539c0()
问题点数:30、回复次数:5Top
1 楼lanser(lanser)回复于 2005-09-11 22:57:41 得分 0
我读取数据库采用的是ODBC方式,直接连接web.mdb数据库文件
Top
2 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-09-12 15:32:42 得分 10
还是要好好检查一下线程之间的同步等Top
3 楼XJM36(Crazy For Star)回复于 2005-09-13 09:19:43 得分 20
access对多线程这种东西的支持本来就不是很好的!Top
4 楼lanser(lanser)回复于 2005-10-07 16:30:39 得分 0
线程同步没有问题的。如果换成MSSQL就不会出问题了。Top
5 楼lanser(lanser)回复于 2005-10-07 16:38:32 得分 0
虽然没有找到最终的原因,还是非常感谢大家Top




