CDaoDatabase不能使用于多线程。
① 在主对话框中建立CDaoDatabase对象,然后把该对象传入到扫描线程中。
这样做的结果是,凡是涉及到数据库操作的语句,如创建,查询等,在运行时都会出错。很明显,这是因为CDaoDatabase对象跨越了主对话框线程和扫描工作线程。
② 在线程中建立CDaoDatabase对象,一切的数据库操作都在单个独立的线程中完成。
这样做的结果是在线程中的所有数据库操作都能正常运行,但是当关闭主对话框时,发生运行错误。
这个错误比较隐蔽。究其原因如下,对于MFC工程,当在工作线程中新建CDaoDatabase对象时,主线程(主对话框线程)会纪录这个对象的指针,即使工作线程结束后,这个对象被释放,在主线程中的CDaoDatabase对象指针仍没有被真正释放,直到主对话框结束时,MFC会对数据库对象做一些注销的扫尾工作。这也就很隐蔽的使工作线程中声明的CDaoDatabase对象跨线程了。
③ 在主对话框线程中建立CDaoDatabase对象,且不传入工作线程中,每当工作线程中要读写数据库时,就向主对话框发消息,让主对话框中的消息响应函数操作数据库。
在主对话框中建立一个隐藏窗口,在该隐藏窗口中建立CDaoDatabase对象,由该隐藏窗口接受工作线程的消息,操作数据库。
这样就圆满的解决了上述问题。当然,由于隐藏窗口是在主对话框进程内创建的,MFC的消息流动机制会使得隐藏窗口处理消息时也会对主对话框的响应产生一定影响,这时,我们只用在每次向隐藏窗口发消息时,用PeekMessage函数强制让主对话框线程把消息队列中的On_Paint消息处理完即可。