ПредишенСледващото

Когато все още се нуждаят

Има моменти, когато програмистът иска да се откаже от VCL. Най-често, разбира се, че е така, защото на икономиката, за да EXE се оказва не толкова (което е почти безсмислен в съвременната епоха, но ако сте в някоя област, като демосцени). Но има и друга неприятна VCL ограничение - той единствен резба. Самият Windows перфектно поддържа многонишкова, и когато искате справедлив паралелна работа на прозорци, е необходимо да се използва API.

Как да се постигне това

Какво обикновено прави програмист, който винаги е работил с VCL, а след това той трябва да прозорци API? Той отива в Google за примери в MSDN за описание на функции. Във всички примери като Интернет се използва за независимо процедурно програмиране. И когато програмист все още се закрепва подобен код - програма раздел с този код се превръща в чудовище. И най-важното - не е ясно как такъв код може да бъде поставен върху концепцията за освобождение на Палестина. Например, както е направено в VCL. Бих искал да се създаде прозорец през TMyWindow.Create, искате да работите с прозореца рамките на един клас, както в VCL. Би било желателно, в крайна сметка, методите съобщения съобщение на процеса.

И това, което ще се постигне

В тази статия ще се опитам да измисля велосипед, за да направи нещо такова VCL структура - а именно да се прозорците ни в концепцията за освобождение на Палестина. Е, аз ще опиша някои от принципите на работа на Windows и прозорци съобщения. Ами, тъй като считам, че prodelyvat никаква работа, необходима за ползата, ние ще се опитаме да направим повторно използвани приятелски код, който може да бъде лесно достъпна и модифициран в бъдещите си проекти, както и за използване, употреба, използвайте го.

Как прозорци работи в Windows

Всеки, който някога е направил един прозорец WinAPI означава, знае какво е необходимо, за да се създаде функция, която ще дойде на нашите послания, регистрация на класа с тази функция, след това да създадете прозорец на базата на своя клас и най-накрая, в потока на кода, за да се направи един безкраен цикъл, който се занимава само с факта, че изборът на публикации на прозорците. И всичко това е много неудобно. На първо място, тъй като не е ясно колко е красива по отношение на код (и дори по-добре от гледна точка на ООП) за създаване на 3, 4 или повече прозорци. След това цикълът имаме един и една функция прозорец, също.

Въпреки това, което е написано, казват те, Windows изпраща съобщения до прозореца - това не е така. Windows изпраща потока на съобщението. Всички създадени прозорци - прикрепени към дадена нишка, която нарича функция CreateWindow. Важно е да се разбере, че ако ние създадохме един прозорец в текущата нишка, а след това всички съобщения ще се обработват само в контекста на тази тема. Това е начина, Windows и внедрява многонишковите работа с прозорци. Така че, ако ние имаме една единствена нишка, създадена на 10 прозорци - всички тези съобщения влизат в един поток, и те трябва да бъдат избрани в един цикъл от този поток. Освен това е възможно да се определи при избора на филтър Хендли (втори параметър GetMessage), или във функцията на прозорец става ясно какво прозорец бе съобщено. Но този процес не се нуждае от прозореца на съобщението, както и потока съобщение, т.е. GetMessage втори параметър, който трябва да имаме 0. Това е важно, защото ние трябва да обработва WM_QUIT на съобщението. Това съобщение никога не стига до всеки прозорец, и единственият вариант е да се избере съобщение - за да премине на втори параметър 0 GetMessage функция. Защо ви е нужен този странен съобщение. И това е необходимо правилно да се измъкнем от цикъла прозорец. Когато направите избора си с GetMessage, функцията винаги се връща ни вярно, но когато GetMessage избира от WM_QUIT на опашката - връща лъжа. Ако искаме да изведнъж излезе от цикъла прозорец веднъж завинаги - тогава ние трябва да се обадя в потока същото PostQuitMessage (ExitCode); и WM_QUIT съобщение ще бъде на опашката на текущата нишка е.

Как прозорци в VCL

В допълнение TApplication твърде обрасло с други функции, и да пренапише VCL код за многонишков подкрепа много трудно. За щастие ние няма да направим това, ние също искаме да се откаже от VCL.

Размисли за архитектурата

Всичко това е по принцип. Ако някои подробности не са ясни - Надявам се, че при реализацията ще станат по-ясни.

От Тап-и ние имаме един от потока - необходимо е да се поддържа списък на, ние имаме това ще бъде масив, ние го наричаме: Приложения: масив от Тап; Тъй като позоваването на масива ще бъде от множество нишки - важно е да се синхронизира достъпа до него. За да направите това, ръководител на критичния участък: AppCS: TRTLCriticalSection;

Всичко това се намира в раздела за изпълнение на модул за други модули нямат достъп до нашите данни.

В изпълнение на същия клас:

Той ще работи правилно и програмата ни е завършена чрез затваряне на прозореца.

Какво ще кажете за многонишкова?

Остава ни да изпълни един прост пример за действието на прозорци в множество нишки. Например, използвам клас TThread, което е Classes.pas. Аз разбирам, че този модул се убива в основата на нашата минималистичен, но моята задача е да се покаже колко лесно работа на нашите прозорци. Може би имам време, ще напиша подобна статия за потоци и ООП. Така че, тук е проста многонишков код на приложението си с два прозореца:

All. Бягай, се появява два прозореца. Според затвори два прозореца операция приложения прекратява.

По-рано, аз говорих за приятелската модул повторна употреба. За съжаление, функционална единица е много малък, най-малко, че не е в състояние да създаде дете прозорци. Точно както няма ни работа с глобалните класовете на Windows. Ние не можем да се създаде модул без промяна дори бутон. Този модул трябва да се разглежда само като база, което показва как е възможно обикновено WinAPI красиво опакован в класове, като се използват възможностите на Delphi и този модул е ​​вече лесно да се усъвършенства до комфортна пълен модул. Bundle функция прозорец се осъществява с класовете, което означава, че проблемът ми може да се счита решен. Standard VCL Delphi работи по същия начин, само с многонишкова в беда прозорци VCL.

Ще се опитам в най-скоро лежеше допълнение към тази статия. Това допълнение ще бъде на един модул, както и описание на часовете ми, която има много повече възможности, отколкото просто написани "на коляното си."

Специално за Delphi Kingdom

Свързани статии

Подкрепете проекта - споделете линка, благодаря!