現在、Win2000Pro + VC++6.0で開発をしています。
MFCのAfxBeginThreadで起動したスレッド内で、CDaoDatabaseのOpenでAccess97形式のMDBを
開き、そのままCloseで開放しようとすると、プログラム終了時に以下のエラーが出て困ってい
ます。
<エラーメッセージ>
バンドルされていない例外はtest.exe(DAO350.DLL)にあります: 0xC0000005: Access
Violation。
マルチスレッド処理中でない場所でCDaoDatabaseを使ってもエラーは出ません。
DAOは、マルチスレッド処理中に使ってはいけないのでしょうか。
もし、そうであれば、マルチスレッド処理中でMDBを開いても大丈夫な処理方法はないものでし
ょうか。
以上、ご存知の方はよろしくお願いいたします。
同じスレッド内でOpen/Closeしていますか?
dairygoods殿
>同じスレッド内でOpen/Closeしていますか?
はい、やっています。
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E3%
82%B9%E3%83%AC%E3%83%83%E3%83%89+dao
プログラム終了時にスレッドはきちんと終了していますか
>プログラム終了時にスレッドはきちんと終了していますか
ちゃんと終了しているつもりです。と言っても、AfxBeginThreadから抜けるのを待つだけ
ですよね?
メモリリークもしてないし・・・。
>ちゃんと終了しているつもりです。と言っても、AfxBeginThreadから抜けるのを待つだけ
>ですよね?
違いますよ。
メインプログラムを終了する前に、スレッドの終了を確認してください。
AfxBeginThreadの後、メインプログラムとスレッドが非同期に動作しますので
AfxBeginThreadから抜けたらスレッドの開始をしただけで終了とは違います。
グローバル変数で終了用のフラグを使って終了確認をされてはいかがですか。
>グローバル変数で終了用のフラグを使って終了確認をされてはいかがですか。
すいません、説明が足りませんでした。
スレッド終了後は、CEventクラスによりシグナル状態にしています。
この問題の対処は、なかなか難しいようですね。
DAOをスレッド内で使うのは止めて、スレッド間通信でMDBにアクセスするしかないのでしょう
か。それとも、どうしてもスレッド内からMDBにアクセスする場合は、接続方法の見直し(例え
ば、ODBC接続にするとか)を考えたほうがよいのでしょうか。
>DAOをスレッド内で使うのは止めて、スレッド間通信でMDBにアクセスするしかないので
しょうか。
DAO の使用が必須なら、それが安全です。
>それとも、どうしてもスレッド内からMDBにアクセスする場合は、接続方法の見直し
(例えば、ODBC接続にするとか)を考えたほうがよいのでしょうか。
DAO にこだわる理由がなければ、それがイチバン簡単でしょう。
ADO を使うのでは駄目なんですか?
>ADO を使うのでは駄目なんですか?
現在、ADOに変更してMDBにアクセスしています。
どうも、マルチスレッド処理中にDAOを使うのはダメっぽいです。
皆様、いろいろとアドバイスいただき、ありがとうございました。