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:
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.
|
Čá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é:
|
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:
|
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:
|
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ěrTí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):
- Sdílení paměti pomocí mapování souborů (1. díl)
- Sdílení paměti pomocí mapování souborů (2. díl)
- Sdílení paměti pomocí mapování souborů (3. díl)
- Sdílení paměti pomocí mapování souborů (4. díl)
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007