在多线程里调用同一com提示"应用程序调用一个已为另一线程整理的接口"

shuihan20e 2009-02-06 01:23:39
搜索了一下,CoInitializeEx(0,COINIT_MULTITHREADED),但是仍然出错,郁闷
...全文
1374 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
金卯刀 2009-02-06
  • 打赏
  • 举报
回复
支持僵哥的建議
僵哥 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shuihan20e 的回复:]
一个简单的线程程序里使用这个接口没有问题,在TIdTcpServer.Execute里有错误
[/Quote]
1.关键要看Indy的版本,如果是支持线程池的,那么对于线程CoInitializeEx(0,COINIT_MULTITHREADED)的执行代码应该放在实际的线程开始执行的位置,CoUninitialize放到线程生命周期结束的位置去.
2.对于使用接口关键在于接口引用计数的维护,对于接口千万一个宿主接口的释放不先于子接口,所有接口的释放不先于CoUninitialize,尽可能不使用隐式接口引用,比如B是A(TA类)下面的接口方法返回TB,C是TB下面的接口方法返回TC,那么千万不能使用:
var
C1: TC;
begin
C1 := A.B.C;
end;

如此就会造成在该函数执行结束之前有一个隐含的B1存在.而如果直接在end;之前就执行CoUninitialize那么问题就出来了.
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
一个简单的线程程序里使用这个接口没有问题,在TIdTcpServer.Execute里有错误
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 unsigned 的回复:]
引用 10 楼 shuihan20e 的回复:
tcpserver.execute里,启动接口的线程在哪,-_-!!!

tcpserver是什么东西?
[/Quote]
TIdTcpServer
僵哥 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shuihan20e 的回复:]
tcpserver.execute里,启动接口的线程在哪,-_-!!!
[/Quote]
tcpserver是什么东西?
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 unsigned 的回复:]
另外还要看看COM组件本身是否支持.
[/Quote]
支持的
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
tcpserver.execute里,启动接口的线程在哪,-_-!!!
金卯刀 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shuihan20e 的回复:]
引用 5 楼 Avan_Lau 的回复:
多線程情況下,用TInterfaceList來管理接口


给个例子可以吧?
[/Quote]
用法參考這里
http://www.swissdelphicenter.ch/torry/showcode.php?id=898
僵哥 2009-02-06
  • 打赏
  • 举报
回复
另外还要看看COM组件本身是否支持.
僵哥 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 shuihan20e 的帖子:]
搜索了一下,CoInitializeEx(0,COINIT_MULTITHREADED),但是仍然出错,郁闷
[/Quote]
不是你的线程当中使用CoInitializeEx(0,COINIT_MULTITHREADED)就可以的,关键在于启动接口的线程.
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Avan_Lau 的回复:]
多線程情況下,用TInterfaceList來管理接口
[/Quote]

给个例子可以吧?
金卯刀 2009-02-06
  • 打赏
  • 举报
回复
多線程情況下,用TInterfaceList來管理接口
shuihan20e 2009-02-06
  • 打赏
  • 举报
回复
有解决方法的
eynStudio 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]
在不同的线程中使用同一个接口,违反了COM接口调用规则
[/Quote]

yes!
bdmh 2009-02-06
  • 打赏
  • 举报
回复
在不同的线程中使用同一个接口,违反了COM接口调用规则
bdmh 2009-02-06
  • 打赏
  • 举报
回复
检查其它引用到com的线程是否结束
从零开始讲述Java线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现线程。 课程目标:    快速上手掌握Java线程的经典课程,    系统、全面、深入掌握Java线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java线程    已有Java开发基础,想要快速掌握Java线程    补充Java线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这是《Java并发编程与源码分析》的第一部分——讲述线程核心基础实现快速上手线程的经典之作   

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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