Окт 16 2009

Установка точки прерывания

Точка прерывания позволяет остановить выполнение программы перед любой выполняемой инструкцией, чтобы продолжать выполнение программы либо в пошаговом режиме, либо в непрерывном режиме до следующей точки прерывания. Чтобы задать точку прерывания перед некоторым оператором, необходимо установить перед ним текстовый курсор и нажать клавишу F9 или щелкнуть мышью на кнопке Insert/Remove Breakpoint на панели инструментов Build MiniBar. Точка прерывания обозначается в виде коричневого кружка на левом поле окна редактирования. Повторный щелчок на указанной кнопке снимает точку прерывания. В программе может быть несколько точек прерывания.


Окт 16 2009

Многофайловые проекты

Никаких особых усилий при создании многофайловых проектов вам прилагать не придется. Разработчики Developer Studio уже позаботились об удобстве вашей работы. Просто надо будет многократно повторить процедуру создания и добавления исходных файлов, описанную выше.
В многофайловых проектах обычно присутствуют и заголовочные файлы. Они создаются/добавляются после щелчка правой кнопкой мыши на пиктограмме папки Header Files в окне Project Workspace. Затем во всплывшем контекстном меню необходимо выбрать команду Add Files to Folder. В результате будет отображено диалоговое окно Insert Files into Project с текстовым полем Имя файла. После ввода требуемого имени, например, AnyName.h, нужно нажать кнопку ОК.


Окт 16 2009

Создание нового проекта

Для создания нового проекта типа Win32 Application нужно выполнить простую последовательность действий:
Выполните команду меню File ► New....
В открывшемся диалоговом окне New выберите вкладку Projects. На этой вкладке надо выбрать тип Win32 Application, после чего указать имя проекта в текстовом поле Project Name, например, HelloFromMsgBox. Также потребуется ввести имя каталога размещения файлов проекта в текстовом поле Location'. Если указанный каталог отсутствует, то он будет создан автоматически. После этого остается только нажать кнопку ОК.
После этого будет запущен так называемый мастер приложений Application Wizard, который открывает диалоговое окно Win32 Application — Stepl of 1 с предложением определиться, какой подтип приложения вы хотите создать. В этом окне надо выбрать опцию An empty project и нажать кнопку Finish.
После щелчка будет отображено окно New Project Information с параметрами проекта и информацией о каталоге, в котором будет размещен создаваемый проект. В этом окне нужно нажать кнопку ОК.
Прежде чем продолжать работу, свернем временно главное окно Visual C++ и заглянем в папку HelloFromMsgBox, созданную мастером приложений для нашего проекта, а точнее, для нашей рабочей области. Там будут расположены файлы HelloFromMsgBox.dsw, HelloFromMsgBox.dsp, HelloFromMsgBox.opt, HelloFromMsgBox.neb. Помимо этого там же будет расположена папка Debug или Release, что зависит от конфигурации проекта. Поясним назначение перечисленных файлов:
HelloFromMsgBox.dsw — файл рабочей области проекта, используемый внутри интегрированной среды разработки. Он содержит всю информацию о проектах, входящих в данную рабочую область.
HelloFromMsgBox.dsp — проектный файл, используемый для построения отдельного проекта. В ранних версиях Visual C++ этот файл имел расширение .так.
HelloFromMsgBox.opt — файл, в котором хранятся опции рабочей области проекта. Благодаря этому файлу при каждом открытии рабочей области проекта все параметры Developer Studio, выбранные во время последнего сеанса работы с данной рабочей областью, будут восстановлены.
HelloFromMsgBox.ncb — этот служебный файл создается компилятором и содержит информацию, которая используется в инструменте интегрированной среды под названием ClassView. Вкладка ClassView находится в окне Project Workspace и показывает все классы C++, определения которых входят в состав проекта, а также все члены этих классов.
Debug — это папка, в которую будут помещаться файлы, формируемые компилятором и сборщиком. Из них нас будет интересовать только исполняемый файл, имеющий расширение .ехе.
Развернем обратно главное окно Visual C++ с открытой рабочей областью , чтобы продолжить работу с первой программой. Следует отметить, что в окне Project Workspace появились вкладки Class View и File View.
Перейдите на вкладку File View. Эта вкладка предназначена для просмотра списка файлов проекта. Откроем список HelloFromMsgBox files, щелкнув мышью на значке с изображением плюса. В результате будет отображено дерево списка файлов, содержащее пиктограммы папок Source Files, Header Files, Resource Files. Все папки пусты, так как проект был создан с опцией An empty project.


Окт 16 2009

Интегрированная среда Visual C++ 6.0

Integrated Development Environment (интегрированная среда разработки), или, сокращенно, IDE — это программный продукт, объединяющий текстовый редактор, компилятор, отладчик и справочную систему.
Мы предполагаем, что пакет Microsoft Visual Studio 6.0, в состав которого входит IDE Microsoft Visual C++ 6.0, уже установлен на вашем компьютере.
Любая программа, создаваемая в среде Visual C++, даже такая простая как «Hello, World!», всегда оформляется как отдельный проект (project).
Проект — это набор взаимосвязанных исходных файлов (с расширением .срр), заголовочных файлов (с расширением .h), файла ресурсов (с расширением .гс) и некоторых других файлов, компиляция и компоновка которых позволяют создать исполняемую программу (файл с расширением .ехе).
Разработчики Visual Studio предусмотрели сервис для коллективной разработки программных продуктов. Он реализован в виде «рабочей области». Рабочая область (project workspace) может содержать любое количество различных проектов, сгруппированных вместе для согласованной разработки.
В данном приложении приводятся минимально необходимые сведения для начала работы с интегрированной средой и для построения проекта типа Win32 Application — empty project. Все примеры программ в книге реализуются в проектах этого типа.
Рабочая область проекта у нас всегда будет содержать только один проект.


Окт 16 2009

Требования к приемнику информации от метеорадиолокатора

Передатчик метеорадиолокатора формирует и выдает по цифровому каналу связи информацию от метеорадиолокатора в соответствии со стандартом «ARINC characteristic 708A»1. Этот стандарт в числе прочих требований определяет также параметры протокола передачи:
Информация от метеорадиолокатора передается пакетами размером 1600 бит. Каждый пакет относится к одному лучу сканирования.
В состав пакета входит:
служебная информация;
информация об угле сканирования — 12 бит;
цветовая информация для 512 точек дальности локационного луча — 1536 бит (по три бита на каждую точку).
Период выдачи пакетов составляет от 5,00 до 7,82 мс.
Максимальная угловая скорость вращения антенны радиолокатора — 90 %.
Приемник информации от метеорадиолокатора должен получать указанные пакеты из цифрового канала связи, распаковывать полученную информацию и отображать радиолокационную картинку на своем индикаторе.
Следует, конечно, более подробно рассмотреть взаимосвязь некоторых параметров протокола передачи.
Код угла сканирования scanAngle представлен целым 12-разрядным двоичным числом. Значение scanAngle может рассматриваться и как беззнаковое число, находящееся в диапазоне от 0 до 4095 в десятичном исчислении, и как знаковое число в диапазоне от -2048 до +2047. В любом случае получается 4096 значений, которые должны покрывать максимальный сектор обзора радиолокатора, равный 360°. Отсюда вес digitWeight одной единицы кода scanAngle вычисляется как 360 / 4096 - 0,087890625°.
Если PACK_PERI0D — период выдачи пакетов в миллисекундах, то максимально возможная скорость сканирования (при условии передачи каждого пакета) ограничена следующей величиной:
speedWithPackPeriod = digitWeight / (PACK_PERI00 / 1000.)
Подставив указанное выше значение для digitWeight и значение 5 для PACK_PERIOD, получим значение speedWithPackPeriod = 17,578°/с. Но ведь протоколом определена максимальная скорость сканирования 90°/с!
Чтобы успевать передавать информацию при такой скорости сканирования, передатчик не отправляет в канал связи каждый очередной пакет, а пропускает несколько пакетов. Введем понятие коэффициента просеивания, который определяется следующим выражением:
sieveCoeff = сеШ sweepSpeedDue / speedWithPackPeriod):
В этом выражении sweepSpeedDue — требуемая скорость сканирования.
Например, если sweepSpeedDue = 90, то для PACK_PERIOD = 5 получаем значение коэффициента просеивания sieveCoeff = 6. Это значит, что передатчик должен отправлять в канал связи каждый шестой пакет.
Приемник должен знать скорость сканирования sweepSpeedDue и период выдачи пакетов. Тогда он может вычислить коэффициент sieveCoeff, который используется на приемной стороне уже как коэффициент размножения луча развертки. Только в этом случае будет восстановлена исходная радиолокационная картинка (конечно, с теми потерями, которые вызваны пропуском sieveCoeff-1 лучей).


Окт 16 2009

Анимация

Создание анимационных приложений — это весьма обширная тема, и ей посвящено несколько статей в MSDN. В связи с ограничениями на объем данной книги мы рассмотрим только самую простую технику анимации, суть которой заключается в чередовании нескольких шагов. Нужно нарисовать объект, через некоторое время стереть его и изменить позицию объекта. Промежуток времени, в течение которого объект остается в текущей позиции, обычно задается таймером.


Окт 16 2009

Стандартный таймер

Стандартный таймер в Windows — это устройство, периодически уведомляющее приложение о завершении заданного интервала времени. Вы можете присоединить стандартный таймер к своей программе с помощью функции SetTimer:
UINT_PTR SetTimer(
HWND hWnd, // дескриптор окна
UINT_PTR nIOEvent, // идентификатор таймера
UINT uElapse, // интервал в миллисекундах
TIMERPROC IpTimeProc // адрес функции - обработчика сообщения WM_TIMER );
Первый параметр, hWnd, содержит дескриптор окна, ассоциированного с данным таймером. Если этот параметр равен NULL, то с таймером не связывается никакое окно и сообщения от таймера будут приходить в специально созданную для этого функцию.
Второй параметр, nIDEvent, позволяет указывать идентификатор таймера, которым может быть произвольное целое число (но не нуль). Если программа использует более одного таймера, то рекомендуется определить идентификаторы таймеров в виде именованных констант, например, с помощью типа enum или директивы #define. Это улучшает читаемость кода программы. Если параметр hWnd равен NULL, то параметр nIDEvent игнорируется.
Третий параметр, uElapse, задает интервал, который может находиться в пределах (теоретически) от 1 до 4 294 967 295 мс, что составляет около 50 дней. Это значение определяет темп, с которым Windows будет посылать вашей программе сообщения WMJFTMER. Сообщения WM_TIMER направляются либо оконной процедуре для окна hWnd, если параметр IpTimeProc равен NULL, либо функции обратного вызова с адресом IpTimeProc — в противном случае.
Если на месте hWnd указано значение NULL, то возвращаемое функцией значение является идентификатором созданного таймера. В любом случае функция SetTimer возвращает нулевое значение, если она не смогла создать таймер.
Если таймер по истечении некоторого времени больше не нужен, то рекомендуется его уничтожить, вызвав функцию KillTimer:
BOOL KillTimer(HWND hWnd. UINT_PTR uIDEvent):
В параметре hWnd указывается дескриптор окна, с которым был связан таймер. Это значение должно совпадать со значением hWnd, указанным при вызове функции SetTimer.
Второй параметр содержит идентификатор уничтожаемого таймера. На его месте используется либо идентификатор, указанный при создании таймера, если он создавался для окна, либо значение, возвращенное функцией SetTimer (для таймера, имеющего собственную функцию обработки сообщений).


Окт 16 2009

Использование команды RDTSC

Начиная с Pentium III, процессоры этого семейства содержат доступный для программистов счетчик меток реального времени TSC (Time Stamp Counter). Это 64-разрядный регистр, содержимое которого инкрементируется с каждым тактом процессорного ядра. Каждый раз при аппаратном сбросе (сигналом RESET) отсчет в счетчике TSC начинается с нуля. Разрядность регистра обеспечивает отсчет времени без переполнения в течение сотен лет.
Пропускная способность — это количество инструкций, выполняемых за один такт при условии их непрерывного продвижения по конвейеру. Латентностъ — это полное время прохождения одной команды по конвейеру. Продвижение машинных инструкций по конвейеру сопряжено с рядом принципиальных трудностей: то не готовы операнды, то занято исполнительное устройство, — и в каждом таком случае конвейер простаивает. При выполнении команд ветвления ситуация еще более неопределенная, так как конвейер заполняется микрооперациями в предположении, что вычисления пойдут по одной из ветвей. Впоследствии это предположение может оказаться ложным, и тогда процессор вынужден вернуться к точке ветвления.
В лучшем случае время выполнения одной инструкции определяется пропускной способностью конвейера, а в худшем — его латентностью. Длина конвейера в современных процессорах колеблется от 12 до 36 стадий. Опустив другие подробности, обсуждаемые в издании [8], приведем заключительную рекомендацию. Минимальный промежуток времени, которому еще можно верить при использовании команды rdtsc, составляет по меньше мере от пятидесяти до ста тактов.
Другая тонкость, которую надо учитывать при профилировке, — это режим компиляции. Напомним, что в среде Visual Studio 6.0 этот режим определяется конфигурацией проекта. Возможны две конфигурации: отладочная (Win32 Debug) и выпускная (Win32 Release). Так вот, если вы занимаетесь профилировкой, то используйте только выпускную конфигурацию! Иначе результаты будут искажены, поскольку в код отладочной конфигурации компилятор вставляет дополнительные отладочные инструкции.


Окт 16 2009

Время Windows

Время Windows — это количество миллисекунд, прошедших с момента старта операционной системы. Этот формат времени поддерживается для обратной совместимости с 16-разрядными версиями Windows. Время Windows хранится в виде 32-разрядного целого числа без знака, которое сбрасывается в нулевое значение после того, как Windows проработает примерно 49,7 дней.
Операционная система управляет временем Windows через прерывания системного таймера, добавляя к текущему значению времени Windows приращение, равное периоду работы системного таймера. Кроме того, система периодически синхронизирует время Windows с показаниями часов реального времени, то есть с системным временем, рассматриваемым ниже.
Системный таймер Windows — это программное устройство, находящееся под управлением операционной системы (в отличие от аппаратного таймера, с которым работали программы под управлением MS-DOS).
Обычно период прерываний системного таймера составляет 10 или около 15 мс в зависимости от аппаратной платформы. Точное значение этого периода, называемое также разрешением системного таймера, можно получить с помощью функции GetSystemTimeAdjustment, имеющей следующий прототип:
BOOL GetSystemTimeAdjustment(PDWORD 1pTimeAdjustment.PDWORD IpTimeIncrement.
PBOOL lpTimeAdjustmentDisabled);
Эта функция предоставляет информацию, относящуюся к синхронизации системного времени и времени Windows. При этом значение, возвращаемое через второй параметр, как раз равно периоду прерывания системного таймера, выраженному в 100-наносекундных единицах.
Например, для компьютера, на котором тестировались программы, приводимые в данной книге (с процессором Intel Celeron CPU 2,0 ГГц и операционной системой Microsoft Windows 2000), разрешение системного таймера, полученное с помощью функции GetSystemTimeAdjustment, равно 15,625 мс.
Для получения текущего значения времени Windows предназначена функция GetTickCount. Функция возвращает число миллисекунд, прошедших с момента старта системы. Точность этого измерения определяется разрешающей способностью системного таймера.


Окт 16 2009

Модель «клиент-сервер»

Чтобы показать применение механизмов обмена между процессами с помощью разделяемой памяти (файла, проецируемого в память) и с помощью сообщения WM_COPYDATA, мы разработаем две программы, имитирующее функции сервера и клиента.
Клиентом называется объект, запрашивающий доступ к службе или ресурсу. Сервер — это объект, выполняющий некую службу или обладающий ресурсом.
Клиент и сервер могут работать на одной и той же машине, используя локальные механизмы коммуникации, или на разных машинах, применяя для связи сетевые средства.
Поведение клиента и сервера асимметрично. Процесс-сервер инициализируется и переходит в состояние ожидания запросов от возможных клиентов. Как правило, процесс-клиент запускается в интерактивном режиме и посылает запросы серверу. Сервер исполняет полученный запрос, причем это может подразумевать диалог с клиентом, а может — и нет. Затем сервер вновь переходит в состояние ожидания запросов от других клиентов.


Следующая страница »