📄 20000916004.htm
字号:
};</p>
<p>当IDL文件被编译时(不带tie类),生成的服务器头(account_s.hh)包括了带有对应界面中每个方法的纯虚方法的框架定义。</p>
<p>CORBA Object Wizard创建一个实现单元,在该单元中从框架类(_sk_Account)衍生一个实现类。它的头文件看起来如下:</p>
<p>#ifndef Interface1ServerH<br>
#define Interface1ServerH<br>
#include "account_s.hh"<br>
//---------------------------------------------------------------------------<br>
class AccountImpl: public _sk_Account<br>
{<br>
protected:<br>
public:<br>
AccountImpl(const char *object_name=NULL);<br>
CORBA::float balance();<br>
};<br>
#endif</p>
<p>你可以在这个类定义加入所需的附加数据成员或方法的定义。例如:</p>
<p>#ifndef Interface1ServerH<br>
#define Interface1ServerH<br>
#include "account_s.hh"<br>
//---------------------------------------------------------------------------<br>
class AccountImpl: public _sk_Account<br>
{<br>
protected:<br>
CORBA::float _bal;<br>
public:<br>
void Initialize(CORBA::float startbal); // not available to clients<br>
AccountImpl(const char *object_name=NULL);<br>
CORBA::float balance();<br>
};<br>
#endif</p>
<p>这些附加的方法和属性来在服务器程序里有效,但没有导出给客户端。</p>
<p>在生成的.cpp文件中,填写实现类的主体,就得到了可以工作的CORBA对象:</p>
<p>AccountImpl::AccountImpl(const char *object_name):<br>
_sk_Account(object_name)<br>
{<br>
}<br>
CORBA::float AccountImpl::balance()<br>
{<br>
return _bal;<br>
};<br>
void Initialize(CORBA::float startbal) // not available to clients<br>
{<br>
_bal = startbal;<br>
}<br>
<br>
当实现CORBA对象的方法时,记住客户请求可能到达不同的线程。因此,你得预防线程冲突。</p>
<p>注意:在你的CORBA服务器中可以编写与BOA交互的代码。例如,使用BOA,可以临时令服务器对象隐藏或失活,过一回再重新激活他们。详见VisiBroker
Programmer Guid。</p>
<p>缺省地,CORBA应用程序是多线程的。这意味着在实现CORBA对象时必须预防线程冲突。通过链接到orb_b.dll和orb_br.dll也可以创建单线程的CORBA服务器,但这样做时就失去了IDE对CORBA的支持或在服务器程序中使用VCL的好处。</p>
<p>除非你指定,否则BOA用缓冲池缓冲客户线程,就是说客户可以使用任何可用的线程。然而也可以确保每个线程始终使用相同的线程,即用逐会话线程策略启动BOA。当所有客户使用同一线程时,可以在线程变量中保存持久客户的信息。详见VisiBroker
Programmer Guid。</p>
<p>Visibroker库包含可以帮助你避免线程冲突的类。它们在vthread.h中定义,安装在VisiBroker的include目录里。VisiBroker线程支持类包括一个互斥锁(mutex)名为VisMutex,一个条件变量(VISCondistion)及读写锁定,读写锁定工作方式类似于VCL的多重读取独占写同步装置(VISRWLock)。使用这些类的好处是他们可被移植到Visibroker支持的任意平台上。</p>
<p>例如,你可以在类实现加入VisMutex域以保护实例数据:</p>
<p><strong>class </strong>A{<br>
VISMutex _mtx;<br>
...<br>
}</p>
<p>然后,当你需要同步实例数据存取时,可以在存取实例数据的任何方法中锁上互斥锁:</p>
<p>void A::AccessSharedMemory(...)<br>
{<br>
VISMutex_var lock(_mtx); //请一把锁,锁要已经被释放退出。<br>
//其它代码,存取实例数据。<br>
}</p>
<p>注意,互斥锁会在AccessShareMemory执行完毕后释放,即使在方法体内抛出了意外。</p>
<p>如果你在服务器程序中使用VCL,BCB包括许多类帮助你预防线程冲突。见联机帮助的Writing multi-threaded applications部分。</p>
<hr>
<p><font face="宋体">1-6 必要时,修改CORBA界面并将修改加进类实现中。</font></p>
<p><font face=宋体>如果在用CORBA Object Wizard生成实现类之后修改IDL文件中的界面,CBuilder让你可以自动更新服务器工程反映这些改变并保证已经写实现类代码不会丢失。</font></p>
<p><font face=宋体>在你修改IDL文件之后,选择Edit|CORBA Refresh。这条命令重编译IDL文件以自动生成服务器和客户文件反映新的界面定义和当前的编译选项。如果IDL文件编译成功,使用Project
Updates对话框,你可以预览并编辑C++BUILDER将做的修改。</font></p>
<p><font face=宋体>注意:如果CBuider找不到与现存实现类相应的界面,会问你是否改变了界面名字。如果答是,会提示你说明界面是怎么改名的,这样实现的类可以正确匹配界面。</font></p>
<p><font face=宋体>当你使用CORBA Refresh命令时,新的方法被加进你的实现类中,申明被更新以反映对现有方法和属性的改变。然而,某些修改不会引起更新。特别是,如果你删除一个方法或属性,它的代码是不删除的。相反,被删除的方法保留在类中,但对CORBA客户不再可用了。相似的,如果你改名一个方法或属性,会被当作一个删除和一个增加,老的方法或属性将保留,并为新方法、属性生成代码。</font></p>
<hr>
<p><font face=宋体>IDL文件注册</font></p>
<p><font face=宋体>尽管注册不是必需的,但如果你只使用静态绑定客户调用到服务器对象,建议注册界面。有两个工作可用来注册界面:</font>
<ul>
<li><font face=宋体>界面仓库(Interface Repository)。注册到界面仓库,客户可以在使用动态请求界面时(<u><strong>D</strong></u>ynamic
<u><strong>I</strong></u>nvocation <u><strong>I</strong></u>nterface)编程获取界面信息。注册到界面库也便于其它开发者在写客户应用时查看你的界面。</font>
<li><font face=宋体>对象激活守护进程(Object Activation Daemon)。注册至OAD,便利可以直到客户需要之时,服务器才加载或对象才实例化。这样可节省服务器上的资源。</font>
<font
face=宋体></font><font
face=宋体> </font></li>
</ul>
</td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -