Олег Федоров

 

В последнее время все большее внимание привлекает к себе разработка канадской фирмы QNX Software Systems - операционная система QNX (аббревиатура от Quick UNIX). Она выделяется из стройного ряда многомегабайтных и тяжеловесных ОС именно своим аскетизмом в отношении к требуемым ресурсам, при этом обеспечивая отличную производительность, многозадачность и поддержку приложений, работающих в реальном масштабе времени.

QNX позиционируется на рынке в качестве ОС для встраиваемых систем, в которых наиболее критичными являются требования легкости (чему сильно способствует модульность QNX) и возможность работы в реальном времени. Другими словами, это - система только для программистов, выполняющая свою работу большей частью (или вовсе) без взаимодействия с пользователем напрямую. Однако развитие этой системы и средств разработки для нее заставляет усомниться, что QNX способна решать только такие задачи.    

Photon Application Builder (PhAB)

В комплект версии 4.24, которая описана в этой статье, входит графическая пользовательская оболочка (GUI) Photon, интерфейс которой сильно напоминает Windows 95, но в отличие от последней занимает всего семь обычных трехдюймовых дискет. Но каково же было мое удивление, когда я, привыкший ко всевозможным средствам визуальной разработки, обнаружил такое средство и в комплекте Photon!

После запуска Photon Application Builder (PhAB) я увидел достаточно стандартную рабочую среду с окнами дизайнера форм, редактора свойств объектов и панелью компонентов (именуемых в QNX “widgets”).

PhAB позволяет сократить продолжительность разработки программ, взаимодействующих с пользователем, за счет автоматической генерации кода на языке Си по созданному интерфейсу. Кроме того, есть возможность быстрого тестирования интерфейса прямо при его создании. Для этого служит закладка Test в дизайнере формы (рис. 1). Воспользовавшись ею, можно посмотреть, как будет выглядеть нарисованное вами диалоговое окно в работе.

Рис. 1. При создании интерфейса можно попробовать его в работе

Реализуя стандартные функции самой оболочки Photon, Application Builder позволяет задавать цвет заголовка окна, менять текст этого заголовка в зависимости от активности окна, а также указывать минимальные размеры окна.

PhAB упрощает жизнь тем, кто любит помещать в качестве фона различные картинки, предоставляя прямо из меню возможность импорта графических файлов формата BMP, GIF и JPEG. Правда, реализовано это несколько, я бы сказал, нестандартно: при импорте графического файла формируется компонент “Метка” (PtLabel), свойство “Тип метки” которого устанавливается в значение “Картинка”.

К сожалению, нет быстрого и удобного инструмента для изменения способа выравнивания компонентов на форме. Для этого служит пункт меню в подменю Edit, хотя гораздо удобнее было бы сделать это обычным свойством каждого компонента и изменять его из окна редактора свойств. Кроме того, нельзя задать “клиентское” выравнивание (когда размеры компонента изменяются согласно изменению размеров формы или компонента-родителя).

Отдельного описания заслуживает редактор свойств компонентов. Сравнив его с аналогами из других средств визуальной разработки, могу сказать, что он достаточно удобен, воплощает ставшую уже стандартом де-факто технологию “местного редактирования” (in-place editing) и имеет адекватные функции редактирования свойств в зависимости от их типа. Так, при редактировании ресурса типа “картинка” появляется графический редактор Pixmap editor, который позволяет не только загрузить уже имеющееся изображение, но и нарисовать новое. Кстати, такую возможность я вижу впервые и надеюсь, что остальные разработчики аналогичных средств воспользуются этим опытом. Также очень удобно, что значения свойств типа “цвет” отображаются как область, закрашенная указанным цветом (а не как символьное имя константы, обозначающей этот цвет).

Поскольку имя свойства компонента не всегда является достаточно информативным, в редакторе свойств вместо него показывается описание свойства (см. рис. 1), само же имя можно узнать из всплывающего окна подсказки, подведя курсор к описанию нужного ресурса. Помимо этого редактор свойств обладает еще одним интересным отличием от известных мне аналогов: описание ключевых для данного компонента свойств выделяется жирным шрифтом.

Но редактор свойств не привлек бы такого пристального внимания, если бы не совмещал в себе кроме перечисленных еще и функции пусть примитивного, но все же менеджера проектов. В отличие от аналогов, обычно имеющих не более двух страниц (вторая - для задания обработчиков событий компонента), редактор свойств в Photon Application Builder содержит еще две дополнительные страницы. На одной из них, показанной на рис. 2, отображается дерево компонентов модуля в том виде, как они расположены на форме. В данном примере на форме располагается панель (компонент PtPane), на котором находятся три кнопки, окно просмотра HTML-текста и поле ввода текстовой информации.

Рис. 2. Редактор свойств работает и как простой менеджер проектов

Другая страница (рис. 3) содержит сводную информацию о всех назначенных (не пустых) обработчиках событий для всех компонентов формы:

Рис. 3. Информация о всех назначенных обработчиках

событий для компонентов формы

Помимо общих характеристик, свойственных всем системам визуальной разработки, Photon Application Builder обладает и рядом очень интересных новшеств, выгодно отличающих его в ряду аналогичных средств, например встроенной поддержкой многих языков при создании локализованных интерфейсов. Эта приятная возможность имеет один недостаток: список языков нельзя расширять. Для отечественных разработчиков это тем более существенно, так как русский язык в нем не фигурирует.

Следуя общим концепциям самой ОС, основополагающими принципами Photon Application Builder являются модульность и повторное использование кода. Воплощением этой идеологии служит механизм разработки на основе готовых компонентов. Практически исключена ситуация, когда вам действительно необходимо писать приложение или собственный компонент, что называется, с нуля. Как в любой грамотно спроектированной библиотеке компонентов, их иерархия построена таким образом, что при создании собственного компонента вам надо лишь правильно выбрать его предка, а при написании приложения - нарисовать интерфейс с помощью уже готовых интерфейсных элементов. Следует заметить, что компонент может иметь одного предка, т. е. множественное наследование недопустимо. Я считаю это вполне разумным шагом для повышения надежности кода. Иерархия компонентов Photon Application Builder представляет собой дерево (рис. 4).    

Рис. 4. Иерархия компонентов Photon Application Builder

Библиотека компонентов

Большинство компонентов являются стандартными для систем визуальной разработки, и их отсутствие было бы более заметно, нежели присутствие. Поэтому нет смысла рассматривать такие компоненты подробно. Остановлюсь лишь на тех, которые либо не имеют аналогов в стандартной поставке аналогичных средств, либо встречаются не так часто.

Сразу бросается в глаза обилие средств для отображения разного рода графики (компоненты - наследники PtGraphic):

- PtArc - эллиптическая дуга, может быть отрисована, как дуга, закрашенный и незакрашенный сегмент эллипса;

- PtBezier - сложная кривая без острых углов, соединяющая заданные точки;

- PtPixel - набор точек;

- PtPolygon - набор соединенных между собой линий, замкнутые сегменты могут быть закрашены, имеется возможность автоматического соединения начальной и конечной точек фигуры.

Кроме наследников PtGraphic для рисования нестандартной графики средствами Photon API существует специальный компонент PtRaw, также рекомендуемый авторами для использования в качестве базового класса для создания собственных сложных графических компонентов. Этот компонент предоставляет доступ к самым низкоуровневым (соответственно - и наиболее производительным) функциям отрисовки. Как следствие, он требует более высокой квалификации программиста. Авторы советуют не использовать его без особой необходимости (в целях повышения надежности приложения). Однако PtRaw незаменим, например, для отрисовки в реальном времени изображения, поступающего с видеокамеры.

Из положительных впечатлений не могу не отметить общность стиля именования компонентов, методов и ресурсов Photon Application Builder, присущую всем уважающим себя инструментариям разработчика. Наверняка вы заметили, что названия всех компонентов начинаются с “Pt”. Исключение составляют лишь два компонента для отображения динамических данных: RtProgress и RtTrend.

RtProgress представляет собой обычный “градусник”, уже знакомый нам по другим средствам разработки. RtTrend же имеет очень мало аналогов в такого вида продуктах и служит для отрисовки графиков, коих на одной системе координат может быть несколько. Этот компонент управляется с помощью минимального, но вполне достаточного набора свойств, которые позволяют задавать рассматриваемый диапазон значений, дистанцию между соседними точками, варианты отображения координатной сетки и т. п.

Очень нестандартными возможностями обладает компонент типа “Метка” (PtLabel). Он может содержать не только текст, но и картинку, а также комбинацию текста с картинкой. Как уже было отмечено выше, именно метка создается системой для отображения фоновой картинки при выполнении команды импорта графического файла, хотя существует, на мой взгляд, компонент, более подходящий для данной цели, - “Фон” (PtBkgd). Этот компонент предоставляет целый ряд способов закраски фонового пространства формы. Кроме картинок он может отображать плавный переход цветов (gradient fill), смену яркости в заданном направлении и множество других эффектов для придания вашему приложению большей (или меньшей - в зависимости от квалификации) привлекательности.

Почти все стандартные элементы управления в Photon имеют довольно непривычные для Windows-программиста средств управления отрисовкой, в частности цветом. Например, у кнопок (PtButton) существует стандартная (т. е. для этого не надо определять процедуру отрисовки) возможность изменения цвета при наведении на нее курсора, у ниспадающего списка (PtComboBox) можно даже поменять цвет рамки, и т. д. В этой связи хочу отметить, что все хорошо в меру. То есть пользоваться этими возможностями надо весьма аккуратно, ибо, как правило, гораздо удобнее работать со стандартным интерфейсом, чем с таким, где у каждого элемента управления свой неповторимый цвет.

Очень полезными функциями обладает компонент “Группа” (PtGroup). Он служит контейнером для помещенных на него компонентов, но в отличие от своих аналогов в других средствах разработки PtGroup может управлять расположением и размерами “дочерних” компонентов: они могут быть упорядочены в линию, в столбик или в виде матрицы, их размеры можно принудительно выравнивать по высоте и/или по ширине, а расположение автоматически изменять для равномерного заполнения заданного пространства.

В моей практике были случаи, когда нужен был элемент управления с функциональностью обычного терминала. Так как реализация в виде консольного приложения по многим причинам не подходила, такой класс пришлось писать вручную. Тем приятнее было обнаружить в PhAB целых два компонента - эмулятора текстового терминала (PtTerminal и PtTty). Второй является наследником первого и служит для автоматического (без назначения обработчиков событий) вывода информации с какого-либо устройства. Возможности управления этими компонентами небогаты, но их вполне достаточно для подавляющего большинства применений.

Отдельное место в библиотеке Photon Application Builder занимает стандартный компонент для отображения HTML-текста (PtHtml). Моя радость от его обнаружения быстро сменилась печалью, так как PtHtml поддерживает лишь HTML 1.0 и способен загружать HTML-файлы только с локального компьютера.

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

В этой связи хочу отметить, что у подавляющего большинства компонентов Photon Application Builder нет так называемых Custom-предков, т. е. предков, реализующих базовую функциональность данного компонента. Такие классы в силу их предназначения обычно имеют только одного прямого наследника, и их наличие уже давно стало признаком хорошего тона в средствах разработки, имеющих более продолжительную историю. В библиотеке PhAB таковыми являются фактически только PtGenList и PtGenTree. Я думаю, этот недостаток можно списать на относительную молодость Application Builder и он будет исправлен в следующих версиях.

Но несмотря на небольшой срок существования PhAB, в его библиотеке уже есть признаки зрелого продукта, например наличие у всех компонентов ресурса Pt_ARG_USER_DATA, выполняющего чисто информативную роль, в котором можно хранить любую строковую информацию. Обычно такие свойства используют для идентификации компонентов или для большей его информативности в случае организации динамических массивов компонентов или в какой-либо другой ситуации, требующей хранения дополнительной информации, ассоциированной с данным компонентом.    

Компилятор Watcom

В состав дистрибутива QNX 4.2.3 входит CD-ROM с компилятором Watcom C/C++ версии 10.6, который, на мой взгляд, является лучшей альтернативой стандартному для всевозможных юниксов компилятору cc. Кроме того, в поставке имеются четыре версии: 16-разрядный компилятор Си, 16-разрядный компилятор Си++, 32-разрядный компилятор Си и 32-разрядный компилятор Си++. Этот диск содержит также ряд полезных для программиста утилит. Например, с помощью средств sample и wprof можно выявлять наиболее продолжительно выполняющиеся участки программы и принимать соответствующие меры.

И уж совсем немыслима жизнь программиста без средств отладки программ. В Watcom эту роль выполняет отладчик wd. Так как я раньше не имел дела с утилитами Watcom и привык к Turbo Debugger фирмы Borland, то его интерфейс показался мне несколько неудобным, но, положа руку на сердце, я ожидал увидеть нечто запредельно аскетичное вроде DOS’овского debug.com, поэтому остался вполне доволен возможностями этого отладчика и относительной простотой его использования.

Среди других утилит из поставки Watcom кроме стандартных, используемых собственно для генерации исполняемых файлов, можно отметить дизассемблер (wdisasm), средство для ведения объектных библиотек (wlib) и программу для отсечения (или добавления) из исполняемого файла ресурсов и отладочной информации (wstrip).    

Сетевые средства QNX

При знакомстве с новой ОС возникает резонный вопрос: а чем, собственно, она лучше остальных? Что в ней есть такого, чего нет (или что гораздо хуже реализовано) в других многочисленных ОС? Этот материал вынесен в отдельную главу только из-за того, что сетевые средства наряду с поддержкой задач реального времени и легкостью являются как бы визитной карточкой QNX, тем, что выгодно отличает ее от других операционных систем.

Если вы уже работали с QNX в сети, то наверняка вас поразила та легкость, с которой эта ОС позволяет с локального компьютера работать на любом другом сетевом компьютере под управлением QNX. Можно просто переключаться с одного узла на другой, не заботясь о его физическом месторасположении.

Для этого предусмотрены низкоуровневые функции, начинающихся с префикса “qnx_”: qnx_net_alive(), qnx_osinfo(), qnx_osstat() и пр. Я не буду вдаваться в подробности, дабы избежать повторения содержимого руководства по библиотеке QNX, только позволю себе сделать некоторые выводы и обобщения. У меня создалось твердое впечатление, что при создании этой ОС разработчики задались целью как можно сильнее сгладить разницу в работе с локальным и удаленным компьютером. И это им вполне удалось. Более того, грамотная и достаточно простая реализация этих возможностей на уровне API заставляет поверить, что простота не является лишь оболочкой для запутанного и сложного кода, реализующего данную функциональность, она - следствие хорошей продуманности ключевых концепций ОС.    

Резюме

Я поостерегусь давать прогнозы о росте популярности QNX у программистов, ибо в наши дни, к сожалению, победа в конкурентной борьбе не всегда остается за объективно лучшими (или просто более подходящими для данной конкретной задачи) программными продуктами. Предпочтение все чаще отдается более распространенным платформам и средствам. К тому же в последние годы наблюдается заметный рост задач с использованием СУБД, а у QNX выбор ограничен только Watcom SQL (новое название - Sybase SQL Anywhere). Но я уверен, что свою нишу задач реального времени легкая QNX занимает прочно и наш любимый монополист, фирма Microsoft, никогда не сумеет в нее вторгнуться и испортить хорошую идею своими многомегабайтными глыбами.

К Олегу Федорову можно обратиться по адресу: oleg@telekurs.ru.

Версия для печати