unit GlobalForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, GlobalHdr;

type

  TReadInfoProc = procedure(var GlobalInfo: TGlobalInfo; var LocalThreads: integer); stdcall;
  TSetProc = procedure(NewValue: integer); stdcall;
  TIncDecProc = procedure; stdcall;

  TProcs = record
    ReadProc: TReadInfoProc;
    SetProc: TSetProc;
    IncProc, DecProc: TIncDecProc;
  end;

  TGlobalFrm = class(TForm)
    GlobalProcessEdit: TEdit;
    GlobalThreadEdit: TEdit;
    LocalThreadEdit: TEdit;
    SharedDataEdit: TEdit;
    ReadBtn: TButton;
    IncBtn: TButton;
    DecBtn: TButton;
    SetBtn: TButton;
    CreateThread: TButton;
    LoadDLLBtn: TButton;
    procedure ReadBtnClick(Sender: TObject);
    procedure IncBtnClick(Sender: TObject);
    procedure DecBtnClick(Sender: TObject);
    procedure SetBtnClick(Sender: TObject);
    procedure CreateThreadClick(Sender: TObject);
    procedure LoadDLLBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    Procs: TProcs;
    Loaded: boolean;
    LibHandle: THandle;
  public
    { Public declarations }
  end;

var
  GlobalFrm: TGlobalFrm;

implementation

uses DelayThread;

{$R *.DFM}

procedure TGlobalFrm.ReadBtnClick(Sender: TObject);

var
  GlobalInfo: TGlobalInfo;
  LocalThreads: integer;

begin
  if Loaded then
  begin
    Procs.ReadProc(GlobalInfo, LocalThreads);
    GlobalProcessEdit.Text := IntToStr(GlobalInfo.GlobalProcesses);
    GlobalThreadEdit.Text := IntToStr(GlobalInfo.GlobalThreads);
    SharedDataEdit.Text := IntToStr(GlobalInfo.SharedNumber);
    LocalThreadEdit.Text := IntToStr(LocalThreads);
  end;
end;

procedure TGlobalFrm.IncBtnClick(Sender: TObject);
begin
  if Loaded then
  begin
    Procs.IncProc;
    ReadBtnClick(Sender);
  end;
end;

procedure TGlobalFrm.DecBtnClick(Sender: TObject);
begin
  if Loaded then
  begin
    Procs.DecProc;
    ReadBtnClick(Sender);
  end;
end;

procedure TGlobalFrm.SetBtnClick(Sender: TObject);

var
  NewInt: integer;

begin
  if Loaded then
  begin
    NewInt := StrToInt(SharedDataEdit.Text);
    Procs.SetProc(NewInt);
  end;
end;

procedure TGlobalFrm.CreateThreadClick(Sender: TObject);

var
  NewThread: TDelayThread;

begin
  NewThread := TDelayThread.Create(true);
  NewThread.FreeOnTerminate := true;
  NewThread.Resume;
end;

procedure TGlobalFrm.LoadDLLBtnClick(Sender: TObject);
begin
  if not Loaded then
  begin
    LibHandle := LoadLibrary('GlobalData.dll');
    if LibHandle = INVALID_HANDLE_VALUE then exit;
    with Procs do
    begin
      ReadProc := GetProcAddress(LibHandle, 'ReadInfo');
      IncProc := GetProcAddress(LibHandle, 'IncSharedInteger');
      DecProc := GetProcAddress(LibHandle, 'DecSharedInteger');
      SetProc := GetProcAddress(LibHandle, 'SetSharedInteger');
      if not (Assigned(ReadProc) and Assigned(IncProc) and Assigned(DecProc)
        and Assigned(SetProc)) then
      begin
        FreeLibrary(LibHandle);
        LibHandle := INVALID_HANDLE_VALUE;
        exit;
      end;
      Loaded := true;
    end;
  end;
end;

procedure TGlobalFrm.FormCreate(Sender: TObject);
begin
  LibHandle := INVALID_HANDLE_VALUE;
end;

procedure TGlobalFrm.FormDestroy(Sender: TObject);
begin
  if LibHandle <> INVALID_HANDLE_VALUE then
    FreeLibrary(LibHandle);
end;

end.