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(步骤)
|