社区
C++ Builder
帖子详情
多线程与ADOQuery的问题。
transcend
2002-12-10 05:03:03
一个普通的porject,加入线程类TThread,其实例mythread调用主窗体Form1->func1();
其中func1用到adoquery如下:
ADOQ->Close();
ADOQ->SQL->Clear();
ADOQ->SQL->Add("Select * from 汇率编码");
ADOQ->Open();
编译通过,但执行至Open()语句会抛出一个EOleException“尚未调用CoInitialize”
如何解决?
...全文
60
18
打赏
收藏
多线程与ADOQuery的问题。
一个普通的porject,加入线程类TThread,其实例mythread调用主窗体Form1->func1(); 其中func1用到adoquery如下: ADOQ->Close(); ADOQ->SQL->Clear(); ADOQ->SQL->Add("Select * from 汇率编码"); ADOQ->Open(); 编译通过,但执行至Open()语句会抛出一个EOleException“尚未调用CoInitialize” 如何解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaojianw
2003-01-18
打赏
举报
回复
mark
transcend
2002-12-12
打赏
举报
回复
怎么样才能保证ado能顺利打开???
hatumei
2002-12-12
打赏
举报
回复
要加上try....catch
ADOQ->Close();
ADOQ->SQL->Clear();
ADOQ->SQL->Add("Select * from 汇率编码");
try
{
ADOQ->Open();
}
catch(...)
{
ShowMessage("db error!");
return;
}
transcend
2002-12-12
打赏
举报
回复
问题仍未解决!!!,用
try
{
Form1->Func();
}
__finally
{
....
}
可以通过,但不一定能打开ado特别在其他机上.
请继续帮忙!!!!
warton
2002-12-10
打赏
举报
回复
研究这中!!!
warton
2002-12-10
打赏
举报
回复
强烈关注!!
copy_paste
2002-12-10
打赏
举报
回复
线程是可以调用主线程或主窗体的方法的,但调用时你得清楚的、明白的,它会不会和主线程发生冲突,只要不发生冲突,随便怎么用都行。
而楼主就属于没注意线程运行,次线程调用主线程的组件,发生XXX错,因为线程运行到ADO组件,线程根本没有为ADO这个COM组件进行CoInitialize,即使是在主窗体的方法中。所以ERROR。。。
而用Synchronize方法,那用多线程就没什么意义了,呵呵,Synchoronize是给主线程发个消息,通知我需要同步一些处理,然后进行sleep状态,直接主线程处理完同步的处理后,才唤醒继续线程的工作。
当然在线程进行Synchronize来调用MainForm的函数/组件是不会有问题的,不过那就没必要用线程了。
主线程中一般会有默认调用CoInitialize & CoUninitialize,所以一般在单线程中我们遇不到什么什么“没有初始化CoInitialize”或什么什么”连线被占用“这样的错。而一用多线程就会,就是这个CoInitialize的错,而不是说你在线程中运行主窗体的方法就不会错,嘿嘿,你那种方法不中。
烟波三千里人鬼五百年
2002-12-10
打赏
举报
回复
错了,哎...Synchronize
烟波三千里人鬼五百年
2002-12-10
打赏
举报
回复
〉〉〉一个普通的porject,加入线程类TThread,其实例mythread调用主窗体Form1->func1();
严重的问题:在线程中调用主线程的VCL方法不能这样啊!
要用Sychronize()
2:这样做多县城还有意义么?应该在线程中创建adoquery是用才是
sncel
2002-12-10
打赏
举报
回复
照copy_paste(木石三) 这样做就可以了。
你的ADO不设置为异步操作时,你的多线程写了也是白写的,达不到效果的。
copy_paste
2002-12-10
打赏
举报
回复
一个普通的porject,加入线程类TThread,其实例mythread调用主窗体Form1->func1();
那就是说线程在哪里运行,就在那里Initialize, Uninitialize();当然最好是在:
MyThread::Execute()
{
CoInitialize();
try
{
Form1->Func();
}
__finally
{
CoUninitialize();
}
}
或者直接在Form1::Func()中过程写
transcend
2002-12-10
打赏
举报
回复
在主窗体上放个AdoQuery,AdoConnection
问题依旧。
invalid
2002-12-10
打赏
举报
回复
错了:应该是就不出现了。
invalid
2002-12-10
打赏
举报
回复
在主窗体上放个AdoQuery,AdoConnection控件好像就出现了。
transcend
2002-12-10
打赏
举报
回复
试过在
void __fastcall TForm1::FormShow(TObject *Sender)
{
CoInitialize(0);
...
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
.....
CoUninitialize();
}
异常同样出现!!!
invalid
2002-12-10
打赏
举报
回复
大错了,看http://expert.csdn.net/Expert/topic/1248/1248184.xml?temp=.4659693吧
invalid
2002-12-10
打赏
举报
回复
那就在启动程序是调用CoInitialize
在关闭程序调用UncoInitialize
sncel
2002-12-10
打赏
举报
回复
问题是什么?
Delphi进度条(
多线程
),美观不卡界面,简单开启,定位,结束
Delphi进度条(
多线程
),美观不卡界面,简单开启,定位,结束: 包目录(MyProgress): MyProgress.dcu //最终引用 MyProgressPackage.bpl //安装包 MyProgressPackage.bpi MyProgressPackage.dcp MyProgressPackage....
Delphi 从EXCEL文件导入到SQLSERVER数据表中 源码
delphi 从EXCEL文件导入到SQLSERVER数据表中 源码,非常有价值 源代码程序,可以参考一下,提供给大家学习
spring.net中文手册在线版
多线程
和并发操作 7.1.简介 7.2.线程本地存储 7.3.同步基础 7.3.1.ISync 7.3.2.SyncHolder 7.3.3.Latch 7.3.4.Semaphore 第八章. 对象池 8.1.简介 8.2.接口和实现 第九章. Spring.NET杂记 9.1.简介 9.2....
delphi
ADO
Query
多线程
查询
多线程
查询 //============================================================================== //
多线程
查询 cxg 2008-09-26 14:29:42 //===============================================================...
Delphi
多线程
下的
ADO
编程
将一后台程序访问数据库的方式从BDE改为
ADO
,原因是由于业务量的增加,通过BDE不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受,大家都知道
ADO
在数据库访问速度方面比BDE要快的多了(我写了一个...
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章