InitializeCriticalSection(&stCS)
把这句拿到线程外

解决方案 »

  1.   

    需要声明声明一个全局变量   CCriticalSection   
    把InitializeCriticalSection(&stCS);放到线程外
      

  2.   

    忘了初始化com环境,需要调用CoInitialize(NULL)/CoUninitialize()
      

  3.   

    要么用一个connection
    要么用完之后把connection关闭
      

  4.   

    对不起  问题提错了 InitializeCriticalSection(&stCS);
    是在线程外初始化的。。临界没问题。。
      

  5.   

    而且线程里面用了AfxOleInit();来初始化com
      

  6.   

    不能只用一个connection对象吧.在线程外定义connection好像不行..只能放在线程内定义创建
    如果用多个.那不是每次打开记录集都要创建一个.打开一次数据库. 不是效率很低. 我的程序. 是1秒对数据库读写有4次左右
      

  7.   

    在线程中操作数据库的地方, try/catch下, 知道错误类型就容易多了
      

  8.   

    1、把数据库操作代码放到try{}catch{}块中,看具体是什么错误
    2、ADO是非线程安全的吧?不建议在线程外Connect,DisConnect
      

  9.   

    线程开始的地方调用:CoInitialize(NULL);
    结束的地方调用:CoUninitialize();
      

  10.   

    我也遇到楼主的问题,ADO动不动就CRASH
      

  11.   

     InitializeCriticalSection(&stCS);  _ConnectionPtr m_pConnection;
       m_pConnection.CreateInstance(__uuidof(Connection));
       m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Program Files\\SMSServer\\edison-gw.mdb","","",adModeUnknown);_RecordsetPtr m_pRecordset; m_pRecordset.CreateInstance(__uuidof(Recordset));
    ThreadFun(LPVOID name)
    {
       int i = 100;
          
       while (i--)
       {
          EnterCriticalSection(&stCS);  //临界区开始
             //....此处代码略, 就是打开userTable表单, 遍历id字段,等于name就把相应imessage的值取出.
          _variant_t = m_pRecordset->GetCollect("imessage");
          m_pRecordset->Close();
          m_pRecordset = NULL;      m_pRecordset.CreateInstance(__uuidof(Recordset));
          //....此处代码略, 就是打开userTable表单, 遍历id字段,等于name的话就执行下面代码
          m_pRecordset->Delete(adAffectCurrent);
          m_pRecordset->Update();  //m_pRecordset->Requery()也不行..
          m_pRecordset->Close();
          m_pRecordset = NULL;
          LeaveCriticalSection(&stCS);//临界区离开
       }
    }