社区
ATL
帖子详情
关于多线程使用com的问题
robert_wjj
2008-10-06 10:39:51
对com不熟悉,但是用到了一个jmail的com组件。我的程序是多线程的,出了点问题,有些时候程序会随机崩溃,估计是线程并发冲突。
google查了下,好像有人说STA的com不能多线程,我也不大懂。不知道这个jmail是STA的么,怎么看?
那我就把CoInitialize(NULL)和CoUninitialize()放到进程中,在所有线程开始前初始化,所有线程结束后释放。
但是这样程序出异常:_com_error,根本没办法发邮件了。
...全文
447
12
打赏
收藏
关于多线程使用com的问题
对com不熟悉,但是用到了一个jmail的com组件。我的程序是多线程的,出了点问题,有些时候程序会随机崩溃,估计是线程并发冲突。 google查了下,好像有人说STA的com不能多线程,我也不大懂。不知道这个jmail是STA的么,怎么看? 那我就把CoInitialize(NULL)和CoUninitialize()放到进程中,在所有线程开始前初始化,所有线程结束后释放。 但是这样程序出异常:_com_error,根本没办法发邮件了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gzstyxb
2008-10-25
打赏
举报
回复
多线程使用COM?在COM中使用多线程?
Amuro1987218
2008-10-25
打赏
举报
回复
我去年用过jmail,也是多现成环境,可能同时会发N个邮件,没出现这种情况。
nodiebirdcomeback
2008-10-24
打赏
举报
回复
组件必须是支持MTA的情况下使用CoInitializeEx才可以创建组件的自由套间
在STA模式下多线程对于在接口的函数调用必须通过封送才可以正常使用
但是对于接口的函数的调用只能在创建组件的线程里完成,在STA模式下
的接口函数的执行是按调用的顺序执行的。
在某一线程ThreadA中,其部分代码如下
IStream* pIStream = NULL;
{
CoInitialize(NULL);
Unknown *I;
IYourInterface* IY;
CoCreateInstance(,,,,&I);
I->QueryInterface(...,&IY);
CoMarshalInterThreadInterfaceInStream(IID_IY,pIY,&pIStream);
.............
CoUninitialize();
}
另外一个线程ThreadB使用ThreadA创建的组件的方法如下:
{
IYourInterface* IY1;
CoGetInterfaceAndReleaseStream(pIStream,IID_IY,(void**)&pIY1);
}
查看组件支持的线程模型在注册表可以看到
在CLID目录下的子目录下的ThreadingModel的项目有指定
如果没有ThreadingModel的一律为STA模式
Jackword
2008-10-24
打赏
举报
回复
你把catch到的_com_error print出来看看
E.Description();
hbuzzd
2008-10-20
打赏
举报
回复
我试了一下,貌似在线程之前调用CoInitializeEx也可以啊!你试试吧!
hbuzzd
2008-10-20
打赏
举报
回复
多线程模式下是必须用CoInitializeEx来初始化COM库的。
至于组件不支持多线程可能是线程模式的问题吧!
nodiebirdcomeback
2008-10-08
打赏
举报
回复
不同的STA进行接口指针的传递要调用COM库函数封送才行的!
robert_wjj
2008-10-07
打赏
举报
回复
之前搞错了,在线程内部创建各自的jmail实例对象是可以的不会崩溃,崩溃是因为另一个原因已解决。
但是这样做的话速度好慢啊。
如果在进程中一次性CoInitialize(NULL)和CoUninitialize(),速度快了好多倍,但是可惜是不稳定,发了几百封邮件就会崩溃。
为什么这个组件不能支持多线程呢?有没有好的办法?
robert_wjj
2008-10-06
打赏
举报
回复
刚才又在进程里,把CoInitialize(NULL); 换成了CoInitializeEx(NULL , COINIT_MULTITHREADED);
奇怪没有对应的CoUninitializeEx(NULL, COINIT_MULTITHREADED);看了别人的例子是CoInitializeEx和CoUninitialize配对的。
这时候邮件发送成功了,不报_com_error异常。但还是中途会随机崩溃。。。。。
robert_wjj
2008-10-06
打赏
举报
回复
[Quote=引用 1 楼 vieri_ch 的回复:]
CoInitialize(NULL)和CoUninitialize() 的作用域是基于线程的,所以必须每个线程都作COM初始化。
你可以在线程内部创建各自的jmail实例对象试试看
[/Quote]
刚开始就是每个线程中都这么做:
try
{
CoInitialize(NULL);
sendMailToManagers(managers, alarmMessage);
CoUninitialize();
} catch( _com_error & E) {
ACE_ERROR ((LM_ERROR, ACE_TEXT("%D %N %l:发送报警邮件给管理员出错, _com_error\n")));
} catch(...) {
ACE_ERROR ((LM_ERROR, ACE_TEXT("%D %N %l:发送报警邮件给管理员出错,其他错误\n")));
}
但是会在中间随机崩溃,估计是不能多线程用这个jmail组件。
aqiu348503
2008-10-06
打赏
举报
回复
是否STA可从注册表里看,多线程要用CoInitialize(NULL,COINIT_MULTITHREAD)初始化
尘雨
2008-10-06
打赏
举报
回复
CoInitialize(NULL)和CoUninitialize() 的作用域是基于线程的,所以必须每个线程都作COM初始化。
你可以在线程内部创建各自的jmail实例对象试试看
多
线
程的实现和
使用
场景
多
线
程的实现和
使用
场景一、多
线
程实现方式1.1 Thread实现1.2 Runnable实现二、多
线
程的
使用
场景1.多
线
程
使用
场景1.1 多
线
程应该最多的场景:1.2多
线
程的常见应用场景:2.多
线
程小案列2.1 多
线
程计算2.2 多
线
程实现卖票小程序2.3多
线
程卖票小程序优化2.4多
线
程卖票小程序优化升级总结 一、多
线
程实现方式 1.1 Thread实现 继承Thread类并重写它的run方法。之后创建这个子类的对象并调用start()方法。下面直接上代码: /** *描述 * @author
Qt 多
线
程基础及
线
程
使用
方式
文章目录Qt 多
线
程操作2.
线
程类QThread3.多
线
程
使用
:方式一4.多
线
程
使用
:方式二5.Qt
线
程池的
使用
Qt 多
线
程操作 应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个
线
程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要
使用
多
线
程,其中一个
线
程处理窗口事件,其他
线
程进行逻辑运算,多个
线
程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。 Qt中
使用
多
线
程需要注意: Qt的默认
线
程为窗口
线
程(主
线
程):负责窗口事件处理或窗口控件数据的更新; 子
线
程负责后台的业
C++多
线
程详细讲解
本文是纯转载,觉得大佬写的非常好!如有侵权可以删除 链接: link. C++多
线
程基础教程 目录 1 什么是C++多
线
程? 2 C++多
线
程基础知识 2.1 创建
线
程 2.2 互斥量
使用
lock()与unlock(): lock_guard(): unique_lock: condition_variable: 2.3 异步
线
程 async与future: shared_future 2.4 原子类型automic 实例 生产者消费者
问题
4 C++多
线
程高级知识 4.1
线
程池
线
程池基础知识
线
程池
3-04多
线
程相关
概念: 多
线
程是指一个进程(执行中的程序)同时运行多个
线
程(进程中负责程序执行的执行单元),多
线
程可以协作完成进程工作,其目的是更好的利用 CPU 资源 Java
线
程具有五中基本状态 新建状态(New):当
线
程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用
线
程对象的start()方法(t.start();),
线
...
java多
线
程
使用
教程
本教程介绍了Java多
线
程的基本知识和
使用
方法,包括创建
线
程、实现Runnable接口、继承Thread类、
线
程同步、
线
程间通信和
线
程池等。多
线
程技术可以提高程序的并发处理能力和响应速度,但同时也带来了
线
程安全和同步等
问题
,需要合理
使用
同步机制来保证
线
程安全。
使用
Java提供的Lock接口可以实现更加灵活和精细的
线
程同步。
线
程间通信可以
使用
wait()、notify()和notifyAll()方法来实现。
线
程池机制可以重用
线
程,提高了
线
程的利用率和效率。掌握了这些知识,可以
使用
Java实现高效、安全、可靠的
ATL
3,245
社区成员
48,537
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章