简单多线程操作ADO问题, 献上100分 InitializeCriticalSection(&stCS)把这句拿到线程外 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要声明声明一个全局变量 CCriticalSection 把InitializeCriticalSection(&stCS);放到线程外 忘了初始化com环境,需要调用CoInitialize(NULL)/CoUninitialize() 要么用一个connection要么用完之后把connection关闭 对不起 问题提错了 InitializeCriticalSection(&stCS);是在线程外初始化的。。临界没问题。。 而且线程里面用了AfxOleInit();来初始化com 不能只用一个connection对象吧.在线程外定义connection好像不行..只能放在线程内定义创建如果用多个.那不是每次打开记录集都要创建一个.打开一次数据库. 不是效率很低. 我的程序. 是1秒对数据库读写有4次左右 在线程中操作数据库的地方, try/catch下, 知道错误类型就容易多了 1、把数据库操作代码放到try{}catch{}块中,看具体是什么错误2、ADO是非线程安全的吧?不建议在线程外Connect,DisConnect 线程开始的地方调用:CoInitialize(NULL);结束的地方调用:CoUninitialize(); 我也遇到楼主的问题,ADO动不动就CRASH 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);//临界区离开 }} 请帮看看 2011 聆听心灵,聆听梦想 只显示窗口的一个控件 《DirectShow开发指南》中的MpegNetwork客户端问题 线程创建线程问题 请问怎么改变控件的调试容器啊. 在CFormView中如何让CListCtrl控件窗口大小变化?(急,急,急) 请问如何实现对本机IP地址、子网掩码、网关、DNS的设置? 更改MFC图标的颜色问题,大于256色时颜色失真 vc中控件的caption用中文,运行得时候显示乱码?? opengl 问题请教 【分享】VC6.0下直接用DDK编译驱动程序的方法
把InitializeCriticalSection(&stCS);放到线程外
要么用完之后把connection关闭
是在线程外初始化的。。临界没问题。。
如果用多个.那不是每次打开记录集都要创建一个.打开一次数据库. 不是效率很低. 我的程序. 是1秒对数据库读写有4次左右
2、ADO是非线程安全的吧?不建议在线程外Connect,DisConnect
结束的地方调用:CoUninitialize();
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);//临界区离开
}
}