Книга: Графика за Windows с DirectDraw

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

Целта на тази книга е да ви научи как да работите с DirectDraw, а не да предостави някаква "структурна рамка" или нестандартен API, който върши цялата работа вместо вас. Демо програмите са написани на C++ и използват MFC, но изобщо не за да скрият всички технически подробности. C++ и MFC са отлични инструменти, защото могат да се използват за писане на всяко приложение по няколко различни начина. Примерите в тази книга са написани за създаване на структурирани, лесни за четене проекти, които ясно показват какво се случва в една програма и защо.

В допълнение към DirectDraw много примери използват библиотеката DirectInput. Строго погледнато, когато програмирате графики за Windows, можете да правите без DirectInput, но все пак си струва да използвате. Той е по-бърз от традиционното въвеждане на Windows и е включен в DirectX, така че нямате нужда от допълнителни SDK, за да работите с него.

Книга: Графика за Windows с DirectDraw

Многопоточност

Секции на тази страница:

Когато цялото внимание е фокусирано върху курсора на мишката, е лесно да забравим, че курсорът е само част от нашето приложение. След появата на курсора приложението не трябва да се различава фундаментално от обсъдените по-горе, така че би било нежелателно да се вмъква въвеждане на мишката и код за актуализиране на курсора в средата на приложението. И дори да се съгласите с това, как ще изглежда този код? Той трябва постоянно да проверяваналичието на нови данни от мишката. Когато бъдат намерени данни, той актуализира курсора на мишката; в противен случай той продължава нормалната си работа. Постоянното запитване на мишката ще забави приложението и ще усложни структурата му. По-добро решение е да разделите приложението на две подзадачи, като използвате многопоточност.

Ако вече сте запознати с концепцията за многопоточност, няма да имате нужда от този раздел. Въпреки това, за начинаещи, той обхваща основите, които трябва да научите, преди да преминете към програмирането. В никакъв случай не трябва да се разглежда като окончателно ръководство за многопоточност.

Нишки и процеси

Независимо дали го осъзнавате или не, вече сте запознати с нишките и процесите. При всяко стартиране на програмата се създава нов процес. Процесът предоставя на програмата всичко необходимо за изпълнение, включително една нишка. Тази стандартна нишка (също наричанаосновна нишка) се използва за изпълнение на програмен код. Основната нишка на типичен процес започва от входната точка (за програмите на Windows това е функциятаWinMain() ) и продължава да преминава през всички цикли, условни изрази и извиквания на функции. Основната нишка прекратява, когато процесът прекратява.

Нищо обаче не ограничава процеса до една нишка. Инструментите MFC или Win32 ви позволяват да създавате допълнителни нишки, които обикновено се използват за изпълнение на фонови задачи. Тези допълнителни нишки (понякога наричани работни нишки) работят независимо от основната нишка (както и една от друга). Всяка нишка има свой собствен стек, но системните ресурси (като файлове и динамична памет) се споделят между нишките.

Защо е необходима многопоточност?

Многонишковостта е полезна заналичието на няколко задачи, които могат (поне частично) да работят едновременно. Добре написано многонишково приложение изглежда просто, защото всяка нишка изпълнява специфична задача.

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

Една последна бележка: на еднопроцесорен компютър многонишковите приложения не работят по-бързо от еднонишковите. Скоростта се увеличава само на многопроцесорен компютър с многопроцесорна операционна система (например Windows NT).

Синхронизиране на нишки

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

Нишките се координират с помощта насъбития(събития), които предават информация за състоянието на една или повече нишки. Едно събитие може да бъде зададено (сигнализирано) или изчистено (несигнализирано). Конкретното значение на събитията може да варира, но те обикновено сигнализират за блокиране на нишка.

Блокирането на нишка може да се разглежда като цикъл, непрекъснато анкетиращ някаква булева променлива. Цикълът продължава, докато променливата станеTRUE. От техническа гледна точка това не е съвсем точно, тъй като блокираната нишка не анкетира активно събитието. Вместо това той е спрян и системата го премахва от списъка с активни нишки. Само след блокиранетосъбитието отива в зададеното състояние, изпълнението на нишката се възобновява. Съответно блокираната нишка не консумира почти никакво процесорно време.

Заключването на нишки най-често се използва за защита на споделените ресурси от едновременен достъп от множество нишки. Mutex (mutex, съкратено от взаимно изключващи се, т.е. „взаимно изключващи се“) е обект, който може по всяко времеда принадлежи къмсамо една нишка, гарантирайки сигурността на достъпа до свързания с него ресурс. Когато мутексът е собственост на нишка, всички други нишки, опитващи се да го придобият, блокират, докато мутексът не бъде освободен.

Критичните секции, като mutexes, се използват за предотвратяване на едновременен достъп на множество нишки до ресурс. Въпреки това, ако mutex може да синхронизира нишки между процеси, критичната секция е ограничена до нишки в един процес. Ограничението се компенсира от скоростта - критичната секция е по-бърза от mutex.

Семафорите (semaphore) също могат да се използват за ограничаване на достъпа до ресурси, но за разлика от mutexes или критични секции, семафорът позволява едновременен достъп от множество нишки. Максималният брой нишки, които могат едновременно да имат достъп до ресурс, се определя при създаването на семафора. След това се предоставя достъп до всички нишки, докато техният брой достигне зададения лимит. Всички други нишки, които искат достъп до ресурса, се блокират, докато една или повече нишки спрат да използват ресурса.

Класове на нишки в MFC

За многопоточно програмиране на Windows можете да избирате между MFC класове и Win32 функции за нишки. Microsoft препоръчва използването в MFC-приложения, класове на нишки. MFC предоставя следните класове за работа с нишки: