关于VisiBroker For Delphi的使用2(2)

2008-04-09 04:19:54来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

begin

CorbaInitialize;

// Add CORBA server Code Here

Acct := TAccountSkeleton.Create('Array Server', TAccount.Create);

BOA.ObjIsReady(Acct as _Object);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

InitCorba;

Memo1.Lines.Add('Account object created...');

Memo1.Lines.Add('Server is ready');

end;

end.

//客户端程序

unit ClientMain;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Corba, StdCtrls, Account_I, Account_C;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ private declarations }

protected

{ protected declarations }

Acct : Account;

myArray : ArrayType;

procedure InitCorba;

public

{ public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.InitCorba;

begin

CorbaInitialize;

Acct := TAccountHelper.bind;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

j: Integer;

begin

InitCorba;

for j := 0 to 2 do

myArray[j] := (j 1) * 100;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.Caption := FormatFloat('InputArray = $#,##0.00', Acct.inputArray(myArray));

end;

end.

上面的程序实例很简单我就不一一说明了,下面我们来看一个数据访问的实例

//IDL

interface Employee {

any getEmployeesByName(in string name);

};

接口方法声明单元

//XXX_Impl.pas

interface

uses

SysUtils,

CORBA,

employee_i,

employee_c;

type

TEmployee = class;

TEmployee = class(TInterfacedObject, employee_i.Employee)

public

constructor Create;

function getEmployeesByName ( const name : AnsiString): ANY;

end;

implementation

uses dmEmployee,DMPooler, provider,DSIntf,ServerMain;

constructor TEmployee.Create;

begin

inherited;

end;

function TEmployee.getEmployeesByName ( const name : AnsiString): ANY;

var

DM: TdmEmploy;

RecsOut: Integer;

Options: TGetRecordOptions;

begin

Options := [grMetaData,grReset]; //must specify meta data

DM := ModulePooler.GetModule as TdmEmploy; //Get instance of datamodule from Pool

try

DM.qryEmployee.Close;

DM.qryEmployee.ParamByName('name').AsString:= name '%';

//显示连接服务器的数量

Inc(Form1.HitCount);

Form1.Label1.Caption := Format('Hit Count = %d', [Form1.HitCount]);

DM.qryEmployee.Open;

Result:=DM.proEmployee.GetRecords(-1, RecsOut, Byte(Options));

DM.qryEmployee.Close;

finally

ModulePooler.FreeModule(DM);//Return instance of DataModule to pool

end;

end;

initialization

//将TdmEmploy对象放入共享池中

ModulePooler.ModuleClass := TdmEmploy;

end.

//共享池的声明单元

主要描述如何提供一个多客户的访问数据提供

unit DMPooler;

interface

uses SysUtils, Classes, Forms, SyncObjs, Windows;

type

//本单元用于为每个客户提供一个独立使用的DataModule对象,相当于我们在以前的CORBA DataModule中选择创建的多线程对象一样的功能

TDataModuleClass = class of TDataModule; //定义类

TPooledModule = record//声明记录类型

Module: TDataModule; //继承标准的TdataModule

InUse: Boolean; //标明上面继承的TdataModule是否在使用

end;

TModulePooler = class

private

FCSect: TCriticalSection; //允许线程自己改变FModules

FModuleClass: TDataModuleClass; //在共享池中类化TDataModule

FModules: array of TPooledModule; //定义一个动态的对象记录数组

FSemaphore: THandle; //限定同时使用的用户规则

public

property ModuleClass: TDataModuleClass read FModuleClass write FModuleClass;

constructor Create;

destructor Destroy; override;

function GetModule: TDataModule;

procedure FreeModule(DataModule: TDataModule);

end;

const

PoolSize = 5;

var

ModulePooler: TModulePooler = nil;

implementation

uses Dialogs;

{ TModulePool }

constructor TModulePooler.Create;

begin

IsMultiThread := True;

FCSect := TCriticalSection.Create;

FSemaphore := CreateSemaphore(nil, PoolSize, PoolSize, nil);

end;

destructor TModulePooler.Destroy;

begin

FCSect.Free;

CloseHandle(FSemaphore);

end;

procedure TModulePooler.FreeModule(DataModule: TDataModule);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于VisiBroker For Delphi的使用1

下一篇:论函数调用约定