开线程连接数据库的问题,提示"尚未调用 CoInitialize".....

lj2lxm 2012-03-03 03:26:32
我在程序中开了一个线程来连接数据库,防止启动程序时候卡机. 连接不上数据库,提示"尚未调用 CoInitialize",于是我在线程函数中初始化COM:CoInitialize(NULL),连接成功了.
我的问题是:我不用CoInitialize(NULL)来初始化COM,而只是sleep(1000)了一下,或者AfxMessageBox("")来打断一下线程函数体的执行也可以连接成功. 这个现象是说明,执行线程的时候会自动初始化COM,但是会耗时吗?
懂的大侠能解释哈嘛......
...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yh198827 2012-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 2 楼 lj2lxm 的回复:
CoInitialize(NULL);这个当然是当放在线程函数体的最开始啊. 如下:
DWORD __stdcall MyThread(LPVOID lpParam)
{
CoInitialize(NULL); //这里用sleep或者消息盒子打断一下也可以连接成功
........; //(连接数据库的过程)
}

我是说你把这个初始化放在……
[/Quote]
这个说法是不对的,已试过了
oyljerry 2012-03-06
  • 打赏
  • 举报
回复
理论上每个线程都应该初始化COM库
hdg3707 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lj2lxm 的回复:]
CoInitialize(NULL);这个当然是当放在线程函数体的最开始啊. 如下:
DWORD __stdcall MyThread(LPVOID lpParam)
{
CoInitialize(NULL); //这里用sleep或者消息盒子打断一下也可以连接成功
........; //(连接数据库的过程)
}
[/Quote]
我是说你把这个初始化放在APP类里的Initinstance(好象是这个函数,就是程序开始运行的初始化函数数),然后再在你想创建线程的类里创建线程,这样看看还是不是出提示,我感觉是还没初始化完成线程就运行了.
lj2lxm 2012-03-05
  • 打赏
  • 举报
回复
我就是想知道为什么打断一下就能解决这个问题. 是像我说的那样初始化COM会自动进行,只是会耗时吗??
lj2lxm 2012-03-05
  • 打赏
  • 举报
回复
CoInitialize(NULL);这个当然是当放在线程函数体的最开始啊. 如下:
DWORD __stdcall MyThread(LPVOID lpParam)
{
CoInitialize(NULL); //这里用sleep或者消息盒子打断一下也可以连接成功
........; //(连接数据库的过程)
}
hdg3707 2012-03-03
  • 打赏
  • 举报
回复
不是吧,你把COM:CoInitialize(NULL)放在启动线程前,试试,如果这条语句紧接着就是启动线程,这时还出提示,那就是说明初始化COM需要点时间,这时可以把启动线程放在初始化函数的最后,这样应该不会出提示了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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