Sdílení paměti pomocí mapování souborů (4. díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

Sdílení paměti pomocí mapování souborů (4. díl)

sdileni pameti

3. října 2002, 00.00 | V dnešním - posledním - dílu seriálu o sdílení paměti pomocí mapování souborů vytvoříme klientskou část naší ukázkové aplikace. Celou ukázkovou aplikaci si pak můžete stáhnout na samém konci článku.

Nadešel čas pro poslední díl našeho seriálu, ve kterém si vysvětlujeme možnosti file mappingu. Dnes si ukážeme naprogramování klientské části ukázkové aplikace. Klientská část je co se vzhledu týče v podstatě stejná jako serverová - skládá se tedy z jednoho formuláře s komponentou typu TMemo. Komponenta ale tentokrát neslouží k psaní, ale pouze k zobrazování toho, co uživatel napsal do okna serverové části.

Úvodní část kódu bude stejná jako u serveru. Proč, to je vysvětleno ve druhém dílu seriálu.

var
  HMessage: THandle;
  HMap: THandle;

const
  MsgId = 'MappingBroadcastMessage';
  MappingId = 'TestMapping';

Část zpracovávající událost OnCreate hlavního formuláře se bude od serveru mírně lišit, zatímco zpracování události OnDestroy bude identické:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  HMessage := RegisterWindowMessage(MsgId);
  HMap:= OpenFileMapping(FILE_MAP_READ,
    False, MappingId);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  CloseHandle(HMap);
end;

V proceduře FormCreate opět zaregistrujeme vlastní kód zprávy Windows. Pak namapujeme stejný soubor jako serverová část. Tentokrát ale místo API funkce CreateFileMapping použijeme OpenFileMapping, sloužící k získání handle na mapování už existující. V prvním parametru říkáme, že chceme z namapovaného souboru pouze číst. Existují i další konstanty, které bychom zde mohli dosadit (např. FILE_MAP_WRITE by znamenala povolení zápisu) - podrobnější popis najdete v nápovědě k Win32 API. Druhý parametr nás nemusí příliš vzrušovat - řeší, zda získaný handle dědí i podprocesy aktuálního procesu. V našem případě je úplně jedno zda dosadíme True nebo False. Poslední parametr je název mapování. Jelikož je stejný jako u serveru, namapuje se ten samý virtuální soubor.

Poledním krokem, který musíme udělat ke zfunkčnění klientské části aplikace, je dopsat obsluhy zprávy HMessage. Pokud by identifikátor této zprávy byl pevný, stačilo by k tomu použít metodou formuláře s direktivou message - třeba takto:

procedure OnMappingBroadcastMessage(var Message: TMessage); message WM_NĚCO;

Jenže náš identifikátor zprávy získáváme až dynamicky za běhu programu - proto na věc musíme jít "od lesa" a napsat si vlastní implementaci metody, která v hlavním formuláři zpracovává všechny došlé zprávy. Ta se jmenuje WndProc:

procedure TMainForm.WndProc(var Message: TMessage);
const
  MaxTextLength = 30 * 1024;
var
  P: PChar;
begin
  with Message do
    if Msg = HMessage then
    begin
      if HMap <> 0 then
      begin
        P := MapViewOfFile(HMap, FILE_MAP_READ,
          0, 0, MaxTextLength);
        Memo1.Text := P;
        UnmapViewOfFile(P);
      end;
      Result:=0;
    end
    else
      inherited;
end;

Co tedy naše implementace WndProc dělá? Především zjistí, zde jde o "obyčejnou" zprávu (takové nás nezajímají a jejich zpracování svěříme rodičovské třídě TForm - proto volání inherited) nebo zprávu s identifikátorem HMessage. V tom případě obdobně jako v serverové aplikaci otevřeme "okénko" do namapovaného souboru (pomocí funkce MapViewOfFile), tentokrát ovšem jen pro čtení. Všimněte si, že proměnná P je typu PChar. Díky tomu ji můžeme použít pro získání ukazatele na otevřené "okénko" a hned pomocí ní nastavit vlastnost Memo1.Text. Samozřejmě toto by nefungovalo, pokud bychom data neměli v mapovaném souboru uložená jako řetězec ukončený nulou.

To je vše - klientskou aplikaci máme hotovou.

Závěr

Tímto dílem jsme dospěli na konec našeho seriálu o mapování souborů ve Windows. Doufám, že vás aspoň trochu inspiroval a také vám naznačil některé problémy, se kterými se při implementaci mapování můžete setkat (zejména volba formátu přenášených dat a synchronizace). U dalších článků a seriálů se těším na shledanou.

Celou ukázkovou aplikaci si můžete stáhnout i se zdrojovým kódem (Delphi 3 a vyšší).

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: