多线程与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 打赏 收藏 转发到动态 举报
写回复
用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的错,而不是说你在线程中运行主窗体的方法就不会错,嘿嘿,你那种方法不中。
  • 打赏
  • 举报
回复
错了,哎...Synchronize
  • 打赏
  • 举报
回复
〉〉〉一个普通的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
  • 打赏
  • 举报
回复
问题是什么?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧