Windows WinAPI, Delphi

Ha mégis szükség van

Vannak esetek, amikor a programozó akar lemondani a VCL. Leggyakrabban persze azért van, mert a gazdaság, az exe kiderül, nem annyira (ami szinte értelmetlen a jelen korban, de ha bármelyik területen, mint például a demoscene). De van egy másik VCL kellemetlen korlátozás - tette egyszálú. Maga a Windows tökéletesen támogatja a multi-threading, és ha azt szeretné, tisztességes párhuzamos működése ablakok, meg kell használni az API.

Hogyan lehet elérni ezt

Mi általában teszi a programozó, aki mindig is a VCL, aztán szüksége van a Windows API? Elmegy Google példákat MSDN leírását funkciókat. Az összes példa, mint az Internet használják ellenére eljárási programozás. És amikor a programozó még gyorsabbá hasonló kód - programrész ezt a kódot fordul egy szörnyeteg. És ami a legfontosabb - nem világos, hogy egy ilyen kódot tudunk a koncepció a PFSZ. Például, ahogy azt a VCL. Szeretnék létrehozni egy ablak segítségével TMyWindow.Create, dolgozni szeretne az ablakon belül egy osztály, mint a VCL. Kívánatos lenne, a végén, a folyamat üzenetek üzenet módszerekkel.

És mi el fogjuk érni

Ebben a cikkben megpróbálom kitalálni kerékpárt ilyet VCL szerkezet - nevezetesen azt, hogy a hajónkat ablakok a koncepció a PFSZ. Nos, fogom leírni néhány működési elvei ablakok és üzeneteket. Nos, mivel úgy vélem, hogy prodelyvat minden szükséges munka javára, akkor próbálja meg újra barátságos kód, amely könnyen hozzáférhető és módosítható a jövőbeli projektek, és használható, használatra, használja azt.

Hogyan működik Windows Windows

Bárki, aki valaha egy ablak WinAPI jelenti, tudja, mi kell ahhoz, hogy hozzon létre egy függvényt, amely akkor jön üzeneteinket, regisztrálja az osztály ezt a funkciót, akkor hozzon létre egy ablakot alapján az osztály és végül, az áramlás a kódot, hogy egy végtelen ciklusba, amely csak foglalkozik azzal a ténnyel, hogy a választás az ablak üzenetét. És ez mind nagyon kellemetlen. Egyrészt azért, mert nem világos, hogy milyen szép szempontjából kód (és még jobb szemszögéből a PFSZ) létrehozása 3, 4 vagy több ablak. A ciklus akkor van egy, és egy ablak funkció is.

Annak ellenére, hogy mi van írva, azt mondják, a Windows üzeneteket küld az ablakon - ez nem így van. A Windows elküldi az üzenetet áramlását. Minden létrehozott ablakok - kapcsolódhat egy konkrét téma, hogy meghívja a függvényt CreateWindow. Fontos megérteni, hogy ha létrehoztunk egy ablak az aktuális téma, akkor az összes üzenet feldolgozása csak a keretében ez a téma. Így a Windows és megvalósítja többszálas munka ablakok. Tehát, ha van egy szál létrehozott 10 ablakok - az összes ilyen üzenet jön egy patak, és úgy kell megválasztani, egy ciklus ezen áramlását. Az is lehetséges, hogy beállítva, amikor a szűrő Hendley (második paraméter GetMessage), vagy egy ablak funkció világossá válik, hogy mit ablak azt jelentették. De a folyamat nem kell az üzenet ablakot, és az üzenet áramlás, azaz GetMessage második paraméter, hogy mi legyen 0. Ez azért fontos, mert kell feldolgozni az üzenetet WM_QUIT. Ez az üzenet nem jut el minden ablakot, és az egyetlen lehetőség az, hogy válasszon egy üzenet -, hogy adja át a második paraméter 0 GetMessage funkciót. Miért van szükség a furcsa üzenetet. És ez szükséges, hogy megfelelően kijutni az ablakon ciklust. Amikor egy válogatást a GetMessage, a függvény mindig visszatér hozzánk igaz, de ha úgy dönt, GetMessage a sorból WM_QUIT - false. Ha azt akarjuk, hogy hirtelen jön ki az ablakon ciklus egyszer és mindenkorra -, akkor meg kell hívni az azonos PostQuitMessage áramot (kilépési kód); és WM_QUIT üzenet lesz az aktuális téma sorában.

Mi a különbség a windows a VCL

Ezen kívül TApplication túl benőtt egyéb funkciókat, és átírni VCL kód többszálú támogatást nagyon nehéz. Szerencsére nem fogunk tenni, hogy mi is akar lemondani a VCL.

Gondolatok Architecture

Ez mind általában. Ha néhány részlet nem világos - Remélem a megvalósítás világosabbá válik.

Mivel TAPP-s van egy az áramlás - meg kell tartani egy listát, mi lesz egy tömb, hívjuk: Alkalmazások: kitűnő TAPP; Mivel a hivatkozás a tömb lesz több szál - fontos, hogy szinkronizálja a hozzáférést. Ehhez vezetője a kritikus szakasz: AppCS: TRTLCriticalSection;

Mindez található végrehajtása részén modul más modulok nem férnek hozzá az adatainkat.

A végrehajtás az azonos osztályba:

Ő fog működni, és a mi a program befejeződik az ablak bezárásával.

Mi a helyzet a multi-threading?

Továbbra is a számunkra, hogy végre egy egyszerű példát működésének ablakok több szálat. Például, azt használja osztály TThread, ami Classes.pas. Megértem, hogy ez a modul megöli a gyökerét minimalista, de a feladat az, hogy megmutassa, milyen könnyű munka a mi ablakot. Talán van időm, írok egy hasonló cikket áramlások és a PFSZ. Szóval, itt van egy egyszerű többszálú alkalmazás kódját két ablak:

Minden. Fuss, 2 ablak. Szerint zárja két Windows alkalmazás művelet befejeződik.

Korábban beszéltem a újrahasználat barátságos modult. Sajnos, a funkcionális egység nagyon kicsi, legalábbis nem képes létrehozni gyermek ablakok. Mint ahogy nincs munka a globális Windows-osztályok. Nem tudjuk létrehozni egy modult módosítás nélkül még gombra. Ez a modul csak akkor javasolt, mint a bázis, amely megmutatja, hogy hogyan lehet a szokásosnál WinAPI szépen becsomagolt osztályok, a Delphi lehetőségeket és ezt a modult már könnyedén finomíthatja a kényelmes teljes modult. Bundle ablak funkció valósul meg az osztályok, ami azt jelenti, hogy a probléma nem tekinthető megoldható. Normál VCL Delphi működik ugyanúgy, csak a multi-threading ablakokban VCL baj.

Megpróbálok nagyon hamar feküdt felül ezt a cikket. Ez a kiegészítés lesz egy modult, és egy leírást az óráimon, amely sokkal több lehetőséget, mint írva „a térdén.”

Különösen Delphi Királyság

Kapcsolódó cikkek