因为要执行大数据量查询及插入操作,我将数据库部分放在线程里,使得用户界面可以及时反映当前操作情况。在线程里使用互斥量控制使得每次只有一个线程运行。但是我发现执行完第一个线程后就出现异常,并且catch捕获不到。
 我在每个线程里单独定义变量 并用CreateInstance初始化也不行。请大虾分析一下原因。

解决方案 »

  1.   

    每运行一个线程都需要用AFXOLEINIT()
      

  2.   

    我用了CoInitialize,应该一样的
    to  wj_xiazi(瞎子) ( ):如果放在进程里,一旦切换到别的界面,就别想再切换回来了。
    _RecordsetPtr MySet_SRC;
    _RecordsetPtr MySet_TAR;
    _ConnectionPtr g_ptrDatabase_SRC;
    _ConnectionPtr g_ptrDatabase_TAR; WaitForSingleObject(Mutex_DB,INFINITE);
    try
    {
    ::CoInitialize(NULL);
    g_ptrDatabase_SRC.CreateInstance(__uuidof(Connection));
    g_ptrDatabase_TAR.CreateInstance(__uuidof(Connection));
    MySet_SRC.CreateInstance(__uuidof(Recordset));
    MySet_TAR.CreateInstance(__uuidof(Recordset));
    g_ptrDatabase_SRC->Open(_bstr_t(sConnSRC),"","",adModeUnknown);
    g_ptrDatabase_TAR->Open(_bstr_t(sConnTAR),"","",adModeUnknown);                   .......
    ::CoUninitialize();
    ReleaseMutex(Mutex_DB);            }
    catch(_com_error &e)
    {.....}
      

  3.   

    AfxOleInit默认是COINIT_APARTMENTTHREADED,你应该把它替换为CoInitializeEx(NULL,COINIT_MULTITHREADED )
    注意事项请查看msdn