转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
《关于VisiBroker For Delphi的使用》(3)         ★★★★

《关于VisiBroker For Delphi的使用》(3)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2625 更新时间:2009/4/23 18:40:07
 

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);

var

  I: Integer;

begin

  FCSect.Enter;

  try

    for I := 0 to Length(FModules) - 1 do

      if FModules[I].Module = DataModule then

        FModules[I].InUse := False;

    ReleaseSemaphore(FSemaphore, 1, nil);

  finally

    FCSect.Leave;

  end;

end;

 

function TModulePooler.GetModule: TDataModule;

var

  I: Integer;

begin

  Result := nil;

  if WaitForSingleObject(FSemaphore, 5000) = WAIT_TIMEOUT then

    raise Exception.Create(''''Server too busy'''');

  FCSect.Enter;

  try

    if Length(FModules) = 0 then

    begin

      SetLength(FModules, PoolSize);

      for I := 0 to PoolSize - 1 do

        begin

          FModules[I].InUse := False;

          FModules[I].Module := FModuleClass.Create(Application);

        end;

    end;

    for I := 0 to Length(FModules) - 1 do

      if not FModules[I].InUse then

      begin

        FModules[I].InUse := True;

        Result := FModules[I].Module;

        Break;

      end;

  finally

    FCSect.Leave;

  end;

  //检查曾经是否连接

  if not Assigned(Result) then

    raise Exception.Create(''''Pool is out of capacity'''');

end;

initialization

  ModulePooler := TModulePooler.Create;

 

finalization

  ModulePooler.Free;

 

end.

//本单元是一个通用的方法单元,当然您也可以采用其他的方法来完成这样的一个功能

//DataModule单元

unit dmEmployee;

 

interface

 

uses

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

  Db, DBTables, Provider;

 

type

  TdmEmploy = class(TDataModule)

    Session1: TSession;

    EmployeeDatabase: TDatabase;

    qryEmployee: TQuery;

    proEmployee: TDataSetProvider;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  dmEmploy: TdmEmploy;

 

implementation

 

{$R *.DFM}

 

end.

//服务器的主单元

unit ServerMain;

 

interface

 

uses

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

  Grids, DBGrids, Db, DBTables, StdCtrls, Corba, Employee_I, Employee_C,

  Employee_S, Employee_Impl;

type

  TForm1 = class(TForm)

    Label1: TLabel;

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

    procedure CorbaInit;

  public

    { Public declarations }

    hitcount : integer;

  end;

 

var

  Form1: TForm1;

 myDBServer :  Employee;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.CorbaInit;

begin

  CorbaInitialize;

  myDBServer := TEmployeeSkeleton.Create(''''myServer'''', TEmployee.Create);

  Boa.ObjIsReady( myDBServer as _Object );

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  CorbaInit;

end;

 

end.

//客户端程序

interface

 

uses

  Windows, Messages, SysUtils, Class

上一页  [1] [2] [3] [4]  下一页


[系统软件]InstallShield Express for delphi制作安装程序定…  [系统软件](转帖) 忘记登录密码的解决方案 for XP/2003/2000
[系统软件]交叉编译sshd for IXP425 ARM  Platform by MVL 3…  [Delphi程序]《关于VisiBroker For Delphi的使用》(4)
[Delphi程序]一个超链接Image控件!(For D3,D4,D5,D6)源代码  [Delphi程序]Five of the best tools for Delphi
[Delphi程序]《关于VisiBroker For Delphi的使用》(2)  [Delphi程序]《关于VisiBroker For Delphi的使用》
[Delphi程序]Delphi for .Net 编译器预览 - by John Kaster  [Delphi程序]编写一个单独的Web Service for Delphi7(步骤)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台