求救!关于一个com组件共享变量的问题

ljmscsq 2009-01-28 10:44:51
我现在在改一个com组件的源码。这个组件是dll的,用VC6 MFC ATL写的。作用是一个网站查询功能的实现。虽然能用,但是在网页上点击查询后要等好长的时间才能出结果。所以我想趁寒假改改。
慢的原因主要是因为每个用户查询的时候com的实例都要分别读取两个文件存成两个表,第一个文件是480k,读取到内存中用一个map<string,string>类型变量存储,第二个文件5k,读取到内存中用一个set<string>类型变量存储。com初始化的时候读取这两个文件比较花时间的。但是这两个文件的内容很重要。而且对这两个类型的变量查询操作很频繁(都是stl的find的操作,不改变里面的内容)。所以我想最好能将它们一次读入,这样每个com实例都能直接用那两个变量做find操作。
有没有简单的办法。是不是需要改成进程外com?我是刚接触com,还有很多不明白。希望大虾们详细讲讲,给我想想办法。谢谢!
...全文
107 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutaooo 2009-01-29
  • 打赏
  • 举报
回复

论坛消息好了。我不用QQ的。COM也是几年前弄的了。现在转平台了,很多细节我都忘记了,只有点概念。希望能帮上你,但也许帮不上。。保持讨论吧。

^_^
ljmscsq 2009-01-29
  • 打赏
  • 举报
回复
谢谢yutaooo大哥。
我大概明白你意思了。
方便的话能不能留个常用的QQ或者邮箱。我做的过程中有什么问题我还能问你!
再次感谢!
yutaooo 2009-01-29
  • 打赏
  • 举报
回复

COM中有包容和聚合这样的概念。类设计也是呀。

将类的成员设计成指向map的指针,而不是map,就能够在各个类实例之间共享map了。

在 DLL_PROCESS_ATTACH 的时候,建立一个map,读取文件,初始化它,并将指向它的指针作为类的构造参数传入就好了。

对于你这个情况,用个单间模式,也挺好。未必一定要成为类的成员。保有全局变量的概念也挺好。

客户程序终止了,但服务进程没有终止呀。dll 一般是惰性终止的。一般会在进程结束时才退出。当然,前提是你不显示的退出它。

退出的问题,可以通过 DLL_PROCESS_DETACH 观察一下呀。
ljmscsq 2009-01-29
  • 打赏
  • 举报
回复
问yutaooo大哥:我要存储的是map <string,string>类型的变量。只要这个变量是全局静态的,在DLL_PROCESS_ATTACH的时候给他从文件导入初值,这样每个com的实例都能直接查询了吗?还有一个问题,因为进程内com组件在用户调用的时候,DLL开始存在内存中,当客户端程序终止时,DLL也结束,那么不就相当于每个客户端调用的时候读文件,这个客户端结束的时候,dll也结束了。那存的数据也没有了啊?这样不就等于在每个客户端调用的时候都要重新读了遍文件嘛。这里的概念不是很清楚,不知道说的对不对!
FoxOnWeb 2009-01-29
  • 打赏
  • 举报
回复
想快的话在网站启动时加载数据,
之后就直接查询了。

yutaooo 2009-01-28
  • 打赏
  • 举报
回复
1.

做在dll里是比较简单的方案。我举个例子:



static const int my_data[] = {
1, 2, 3, 4, 5, 6 .........
};

int my_dll_func() {

}



直接把数据写在程序里好了。这里,my_data会放在dll的 .data section 里。跟随dll一起发布。

当然,你会有一个巨大的 dll。但没问题,你反正一定要这些数据存在内存中的。

当 dll 映射引各个进程中时,那些数据也都在的。既然你怀疑频繁读文件是热点,那就让他们不读好了。


2.
另一个问题。为什么要在用户查询时候再去读入文件呢?在dll加载时不好吗?

3.
进程外的组件同样有进行间通信的开销。这个开销还是挺大的。远比dll这进程内的大。如果,你决定用进程间的COM组件,那关键就在于你使用组件的频繁程度。如果很频繁,那就不见得合算了。
ljmscsq 2009-01-28
  • 打赏
  • 举报
回复
文件里的内容是不该了,楼上的,后面一句没看明白
yutaooo 2009-01-28
  • 打赏
  • 举报
回复

先问你,文件里的内容确定不改了吗?能不能做为dll的资源,做进com所在的dll?
waizqfor 2009-01-28
  • 打赏
  • 举报
回复
对com也不熟悉
找了一个不错的系列文章 COM 组件设计与应用(一)
http://www.vckbase.com/document/viewdoc/?id=1483
这是1 还有好几章 LZ可以熟悉一下应用
ljmscsq 2009-01-28
  • 打赏
  • 举报
回复
大侠们都睡觉去了?自己先顶下吧

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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