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

解决方案 »

  1.   

    好象看到过类似帖子:(
    每次运行一个新的现成记得AfxOleInit();
      

  2.   

    我用的CoInitialize,应该一样的
    该线程在一个循环里被调用,有几个表就调用几次,用互斥量控制.互斥量Mutex_DB已在主线程里建立
    线程代码如下:
    _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.   

    你为什么不在每个线程里面定义自己独立的智能连接指针呢?既然每一个都要进行创建和打开!不过我看你的问题可能是前面的步骤有问题,你判断一下前面操作的返回值,例如hr= g_ptrDatabase_Src.CreateInstance(__uuidof(Connection));看是否S_OK = hr,我估计是前面初始化和打开数据库链接的问题,否则数据库操作异常不可能捕捉不到的。还不行的话,你将你的错误提交上来看一下。
      

  4.   

    _RecordsetPtr MySet_SRC;
    _RecordsetPtr MySet_TAR;
    _ConnectionPtr g_ptrDatabase_SRC;
    _ConnectionPtr g_ptrDatabase_TAR;
    是在线程里定义的.
    我现在太忙了,过几天我会再试一下.谢谢各位关心,请保持关注
      

  5.   

    两个可能原因:
    异常不是ado造成的,加个catch(...)试试
    VC打Pack了吗,早期的VC就是catch不到东西
      

  6.   

    CoInitialize默认是COINIT_APARTMENTTHREADED
    使用CoInitializeEx(NULL,COINIT_MULTITHREADED )
    注意事项请查看msdn