关于CDaoDataBase的总结

CDaoDatabase不能使用于多线程。

① 在主对话框中建立CDaoDatabase对象,然后把该对象传入到扫描线程中。

这样做的结果是,凡是涉及到数据库操作的语句,如创建,查询等,在运行时都会出错。很明显,这是因为CDaoDatabase对象跨越了主对话框线程和扫描工作线程。

② 在线程中建立CDaoDatabase对象,一切的数据库操作都在单个独立的线程中完成。

这样做的结果是在线程中的所有数据库操作都能正常运行,但是当关闭主对话框时,发生运行错误。

这个错误比较隐蔽。究其原因如下,对于MFC工程,当在工作线程中新建CDaoDatabase对象时,主线程(主对话框线程)会纪录这个对象的指针,即使工作线程结束后,这个对象被释放,在主线程中的CDaoDatabase对象指针仍没有被真正释放,直到主对话框结束时,MFC会对数据库对象做一些注销的扫尾工作。这也就很隐蔽的使工作线程中声明的CDaoDatabase对象跨线程了。

③ 在主对话框线程中建立CDaoDatabase对象,且不传入工作线程中,每当工作线程中要读写数据库时,就向主对话框发消息,让主对话框中的消息响应函数操作数据库。

这样做,程序不会崩溃,但是,由于硬盘中有大量的文件,向数据库中的读写操作非常多,GUI对话框主线程由于处理了太多的消息而使得主界面很长时间无法响应,这是一个GUI程序不能允许的,因此,此方法也行不通。

在主对话框中建立一个隐藏窗口,在该隐藏窗口中建立CDaoDatabase对象,由该隐藏窗口接受工作线程的消息,操作数据库。

这样就圆满的解决了上述问题。当然,由于隐藏窗口是在主对话框进程内创建的,MFC的消息流动机制会使得隐藏窗口处理消息时也会对主对话框的响应产生一定影响,这时,我们只用在每次向隐藏窗口发消息时,用PeekMessage函数强制让主对话框线程把消息队列中的On_Paint消息处理完即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值