DCOM配置方法及DCOM并行计算程序的构建

上传人:飞*** 文档编号:7910785 上传时间:2017-09-24 格式:DOC 页数:34 大小:903KB
返回 下载 相关 举报
DCOM配置方法及DCOM并行计算程序的构建_第1页
第1页 / 共34页
DCOM配置方法及DCOM并行计算程序的构建_第2页
第2页 / 共34页
DCOM配置方法及DCOM并行计算程序的构建_第3页
第3页 / 共34页
DCOM配置方法及DCOM并行计算程序的构建_第4页
第4页 / 共34页
DCOM配置方法及DCOM并行计算程序的构建_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《DCOM配置方法及DCOM并行计算程序的构建》由会员分享,可在线阅读,更多相关《DCOM配置方法及DCOM并行计算程序的构建(34页珍藏版)》请在金锄头文库上搜索。

1、LAO DUAN感谢焦龙同学的耐心讲解1. 如何搭建 DCOM 编程、运行环境N 台机器的用户名和密码必须相同。最好是用 AdministratorLAO DUANLAO DUAN进入 VC+6.0,打开 HelloDcom.dsw,组建工具栏调出来。程序全编译一遍Server - 组建-全部组建LAO DUANPSAddSub - 工具 - Register ControlLAO DUAN至此配置完成看两台机器是否可以进行 DCOM 访问:网上邻居:看访问 125.223.8.122 是否成功,进入工作组,输入如下:LAO DUAN出现如下就证明可以进行通信了。本机 IP = 125.223

2、.8.113。测试的时候这里添加自己的 IP 号就行。如果想连接对方(125.223.8.122) ,就填对方的 IP 号即可。这只是一个例子,测试程序而已。以后讲到的 IP 访问将不是这个样子。运行LAO DUAN2. 如何新建立一个 DCOM 工程。Parallel Mesh Search=PMS,原地盖高楼。之前那些事对于例子程序的调通,下面是如何新建立一个 DCOM 工程。DCOM 工程大概分为 3 个子工程:Server 端、代理 DLL、Client 端。这 3 部分分别要建立 3 个工程。2.1 建立 Server 端先建立一个空白的工作区LAO DUAN再新建 Server 端

3、工程 PMSLAO DUANLAO DUANLAO DUAN组件接口函数的定义HRESULT Para_MeshSearch( in long length,in,size_is(length) long* raw_Array, out,size_is(length) long* back_Array );组件接口函数的声明LAO DUAN在 public:里面加入一句话 STDMETHOD(Para_MeshSearch)( long length, long* raw_Array, long* back_Array);组件接口函数的实现向此文件中添加:STDMETHODIMP CPMSCo

4、m:Para_MeshSearch(long length, long* rawArray, long* outArray)/函数功能return NOERROR;注意,在编写 PMSCom.cpp 也就是 Server 端代码的时候,接口函数中数组 rawArray 是一个 long*类型,在接口函数中不用重新给这个 rawArray 分配空间。因为调用这个函数的时候实参是一个具体数组。组件注册:一般地,编译完成服务器自动注册选中 PMSCom.cpp,再编译!LAO DUAN2.2 建立代理 /存根 DLL这 2.2 节都是在 PSPMS 工程中的操作。再新建一个工程 PSPMSLAO D

5、UANLAO DUANLAO DUAN向 PSPMS.def 中添加如下内容:LIBRARY PSPMSEXPORTSDllGetClassObject PRIVATEDllCanUnloadNow PRIVATEDllRegisterServer PRIVATEDllUnregisterServer PRIVATEGetProxyDllInfo PRIVATE把 PMS.idl 生成的如下 4 个文件加入到工程中。方法如下:LAO DUANLAO DUAN在如下位置加入 ,REGISTER_PROXY_DLL, _WIN32_DCOM在如下位置加入 rpcndr.lib rpcns4.lib

6、 rpcrt4.lib 记得 rpcndr.lib 前面加个空格LAO DUAN编译,连接注册 dll:LAO DUAN2.3 建立客户程序新建一个工程LAO DUANLAO DUANLAO DUANPMS_Client.cpp 中的#include stdafx.h删了它就可以了。 。 。否则有出不尽的编译、链接错误。客户端 PMS_Client 工程必须包含 PMS.h 和 PMS_i.c 文件。方法上面都说过了。LAO DUAN注意:在客户端,无论编写 debug 还是 release 程序,projectsetting c/c+中的 code generation 下的 Use run

7、-time library应选 DEBUG Multithreaded DLL。下图所示:LAO DUANLAO DUAN3. 代码填充3.1 PMS_Client.cpp 的框架可能用到的头文件#include #include #include #include #include #include #include ./PMS/PMS.h /这个一定用得上#define MAX_SERVER_NUM 20 /服务器的最大个数using namespace std;struct PMS_Rangelong *Trans_Array;long *Back_Array;long length;i

8、nt pid;定义 struct PMS_Range,这个东东任务分配用的。变量一般要定义为结构体数组,目的是传给好几个处理机,每一个结构体数组元素就是一个处理机的任务。添加到多线程调用的参数中,跟多线程一起传到处理机那边。struct PQS_Timetime_t start;time_t end;PQS_Time ptime; /处理机共同的时间,总体的时间全局变量:int ser_num; /用户设定服务器个数long element_num; /数据量,数量级,保证很大的HANDLE PMS_ThreadMMAX_SERVER_NUM; /客户端线程,保证每个线程对应一个服务器char

9、 ProcessorMAX_SERVER_NUM15; /服务器 IP 地址PMS_Range rangeMAX_SERVER_NUM; /任务划分范围从 servername.txt 中读取 IP 地址列表。文件里面每一行是一个 IP 地址。void ReadProcessorList()int i;ifstream infile(servername.txt, ios:in);for(i=0;iProcessori;infile.close();多线程运行函数。一个线程运行一个这样的 run 函数。DWORD WINAPI run(LPVOID pRange)LAO DUANPMS_Ran

10、ge* myrange = (PMS_Range*)pRange;/通信部分return 0;ptime.start=GetTickCount(); /开始计算时间ptime.end=GetTickCount(); /停止计算时间printf(n 本次运算使用了 %d 台处理机,运行时间为: %dmsn, ser_num, ptime.end-ptime.start);3.2 通信部分红色的字为个性化信息,表示使用模板后需要根据自己工程的命名、函数调用改动的地方/绿色的字,你懂的,不解释。 。 。HRESULT hResult;hResult = CoInitialize(NULL); /初始

11、化 COM 库if (FAILED(hResult)return 0;IClassFactory *pClf;IUnknown *pIUnknown;wchar_t ip42 ; /放弃使用 CString 类型,用 wchar_t 好int len = strlen(Processormyrange-pid);mbstowcs(ip, Processormyrange-pid, len); /转换单字符串为宽字符串iplen = 0 ; /设置字符串结尾COSERVERINFO ServerInfo = 0, ip, NULL, 0 ; /获取服务器信息hResult=CoGetClassO

12、bject(CLSID_PMSCom,CLSCTX_SERVER, &ServerInfo,IID_IClassFactory,(void*)&pClf); /创建类厂printf(n 线程%d 正在连接服务器 %s,myrange-pid,Processormyrange-pid);if (FAILED(hResult)printf(n 连接服务器%s 失败, Processormyrange-pid);return 0;hResult = pClf-CreateInstance( NULL,IID_IUnknown,(void*) &pIUnknown); /创建组件对象if (FAILE

13、D(hResult) printf(n 创建组件对象失败%d, myrange-pid);pClf-Release();return 0;LAO DUANpClf-Release(); /释放类厂IPMSCom *pIMeshSearch;hResult = pIUnknown-QueryInterface(IID_IPMSCom, (void*) &pIMeshSearch);/查询接口if (FAILED(hResult)pIUnknown-Release();return 0;/调用接口函数pIMeshSearch-Para_MeshSearch( myrange-length,myra

14、nge-Trans_Array, myrange-Back_Array ); pIMeshSearch-Release();pIUnknown-Release();pIUnknown = NULL;CoUninitialize(); /释放 COM 库printf(n 线程%d结束.,myrange-pid);3.3 多线程在做并行计算的时候,需要几台处理机同时完成多个任务,这时,Client 程序要建立 N 个线程,这 N 个线程将与 N个处理机进行通信,将划分好的任务传给它们。每一个线程,都执行 DWORD WINAPI run(LPVOID pRange)函数,在这个函数里面建立与处理机

15、的链接,并且调用远程处理机上的接口函数,将任务传过去。等远程处理机做好以后,从out参数又传回数据。最后,Client 将 N 个线程的传回数据加以处理。全局变量HANDLE PMS_ThreadMMAX_SERVER_NUM; /客户端线程,保证每个线程对应一个服务器线程函数DWORD WINAPI run(LPVOID pRange)./这个函数里面写通信的部分,3.2 节彩色的部分那段。主函数里面调用这段:/这里设置起始时间点,用于计算加速比for(i=0;isetting-link-input-Object/Library Modules,加入“mfcs42d.lib MSVCRTD.lib”,顺序不能乱LAO DUANLinking. mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain12 already defined in dlldata.obj 的解决方法如下:将_USRDLL 删掉LAO DUAN出现如下错误:Linking.na

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号