描述:
我做了com组件(dll),但是其中包括一个循环次数很多的函数,消耗资源很大,可以在com组件内部用多线程呢?还是在外部用多线程?不用多线程,还有其他方法么?谢谢。
解决方案1:
关注~~~
解决方案2: 关于能否用多线程解决循环次数很多的问题IUnknown886(LiuJun)已经做了很好的解释。现在对COM里的多线程问题提些看法:
1. 首先肯定,COM组件里面可以用多线程。而且在实际应用中也是比较常用的。比如读写串口,需要读/写两个线程。
2. COM通过套间帮助程序做同步,但是在很多时候还是需要自己做好同步。因为同步是多线程编程普遍要处理的问题。
那怎么在线程里调com组件呢?我用CreateDispatch调com组件,然后用接口函数,在一个线程里调它,但是怎么都进不去,这是怎么回事?
---
1。 先确定你的组件是支持哪种套间,FREE,APARTMENT还是BOTH。默认是APARTMENT。可以修改.rgs文件来改变。
2。 如果是APARTMENT,在线程函数中一定要调用CoInitialize(NULL)或CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)或AfxOleInit().退出前调用CoUninitialize()。估计你的组件属于这种情况。
关于套间详细问题,可以看MSDN资料。
第一,你想通过多线程提高速度,是不可能的,多线程只是让CPU把时间片分给几个线程执行,假设电脑中只有一个线程,要完成你的任务需要一个小时,现在你用两个线程来做,CPU会分给每个线程半个小时,总时间还是一样,一点也不会提高运行速度.你要想计算得快点,只有改算法,多线程要解决的是多任务的问题,而不是速度的问题;
第二,在COM内部写多线程代码可以通过,但一般不这么写,因为COM是用来给外部调用的,同步是它的一个大问题,现在如果在它的内部再做多线程,同步就更成问题了,而且出现的问题很难退踪,因为出现的问题什么时候再出现是随机的,与CPU当时怎么调用线程的顺序有关;在外部,多个线程可以并行对COM进行调用,这涉及同步问题,即要保证COM能顺利地完成它内部完事的逻辑.这是一个需要深入研究的问题,你可以看看有关"套间"的文章.
第三,如果你想让COM组件在计算的时候,不要让界面死在那里,你要做的是在客户端做多线程,其用一个作为工程线程,等着COM返回结果,另一个是界面线程,可以让用户继续做其它的事.COM计算完成后,工作线程得到返回值,然后通知界面线程.
总之一句话,你想用多线程在服务器端来解决你的问题,基本上是不可行的.改进算法是关键.
个人观点,仅供参考
优化算法 , 如果还不行,就升级机器配置, 采用 并行多处理器, 增加内存.等等 . 如果还不行的话, 将你的程序移植到 巨型机上去运行. 或者分布式运算: 使用N台计算机组成的计算机组 来进行分布运算.
解决方案5: 多线程用来处理这样的问题也许是在耗费CPU,应该从本质出发
根据应用的特点想办法减少计算量,而不是绕过这个问题
多线程能解决“循环次数很多的函数,消耗资源很大”的问题吗?