- •1 Билет
- •1) Стандарт орс (назначение и общее представление, орс сервер, орс группа, орс item).
- •2) Процесс разработки по систем управления(обычный подход – «waterfall», итеративный подход).
- •2 Билет.
- •1) По систем управления. Основные понятия(представление о классах, сом интерфейсах, ActiveX).
- •Билет №3.
- •2) Оригинальные инструментальные средства разработки программного обеспечения систем управления (nCsApp Wizard, State Machine Builder).
- •Билет №4.
- •1) Основные классы mfc (cObject, коллекции, cString, cWnd, механизм документа отображение).
- •2) Идеи компонентного подхода (базовый интерфейс iUnknown, включение, агрегация).
- •IUnknown
- •5 Билет.
- •1) Операционные системы реального времени и системы управления (классификация систем реального времени, Windows nt & rtx, VxWorks, многопоточность).
- •2) Поддержка com в Windows nt (реестр Widows, dcom, реализация сервера в процессе, реализация сервера за пределами процесса).
- •6 Билет.
- •1)Средства синхронизации потоков на примере Windows nt & rtx (Критическая секция,mutex, семафор, shared memory, приоритеты, ...).
- •2) Распределенная модель системы управления (Пример выделения компонентов на базе геометрического канала).
- •Глава 4. Технологии разработки программного обеспечения систем управления 221
- •7 Билет.
- •2.2.3. Базовые понятия операционной системы реального времени
- •2.2.4. Использование в системах управления операционной системы Windows nt
- •2) Общее представление, назначение и использование ActiveX (место ActiveX-элементов в системе управления, способы их создания на базе mfc и на базе atl).
- •4.4.1. Базовые понятия
- •9 Билет.
- •1)Стратегия диспетчеризации на базе расширения rtx (основные потоки системы управления с использованием Windows nt и rtx).
- •2)Назначение страниц свойств, сериализация свойств (стандартные и пользовательские property page).
- •2) Назначение страниц свойств, сериализация свойств (стандартные и пользовательские property page).
- •10 Билет.
- •1) Базовые функции коммуникационной среды (запрос, управление, отображение, вспомагательные функции; выделение фазы обмена данными).
- •2) Идеи ole-автоматизации (базовый интерфейс iDispatch, его ключевые функции).
Билет №3.
1) Ключевые программные приемы, применяемые в системах управления (выбрасывание исключений и их обработка, вложенные исключения, создание пользовательского класса исключений в MFC, ASSERT(), VERIFY(), TRACE()).
Выбрасывание исключений и их обработка
Исключение (exception) - это ситуация, которую операционная система считает ошибкой.
Когда приложение вызывает исключение, операционная система пытается уведомить это приложение об ошибке, вызвав соответствующий обработчик (если он существует). Если в приложении не предусмотрен такой обработчик, операционная система пытается решить проблему самостоятельно, часто завершая программу и отображая немногословное сообщение для пользователя: "Программа выполнила недопустимую операцию и будет закрыта".
Существует два уровня обработки исключений:
структурная обработка исключений (structured exception handling, SEH) выполняется только операционной системой;
обработка исключений C++ выполняется при появлении ошибок в приложениях, созданных средствами Visual C++.
Общий синтаксис обработки исключения в C++ такой:
try { // Начало "пробного блока".
throw выражение; /* "Выбрасывание" исключения. */}
catch(тип переменная) { // Заголовок обработчика для <типа>.
тело_обработчика) [catch ...] // Возможно, обработчики других типов.
Ключевое слово try начинает пробный блок операторов, показывая, что данный блок может генерировать исключение. Тело блока заключается в фигурные скобки. Оно может содержать вызовы функций, тело которых при этом тоже будет рассматриваться как принадлежащее пробному блоку. Блоки try могут быть вложенными. (вложенные исключения)
За пробным блоком следует один или несколько обработчиков исключения, начинающихся ключевым словом catch. За ним следует объявление исключения в круглых скобках, аналогичное формальному параметру функции:
try {...}
catch(int. i) { /*Перехватывает исключения типа int.*/}
catch(char* str) { /* Перехватывает char*. */}
catch (...) { /* Перехватывает все остальное. */}
Если тип выброшенного в пробном блоке исключения совпадает или совместим (об этом позже) с типом в объявлении некоторого обработчика, то данный обработчик перехватывает исключение. Если нет, то поиск подходящего обработчика продолжается далее. Обработчик, в заголовке которого вместо объявления исключения стоит многоточие (...), перехватывает исключения любого типа; такой обработчик должен быть последним в ряду тех, что следуют за данным блоком try
Исключения могут генерироваться или, как принято говорить в C++, выбрасываться либо исполнительной системой C++, стандартными функциями и т. д., либо самим программистом с помощью оператора throw. Он состоит из ключевого слова throw, за которым следует необязательное выражение.
Основные макросы отладки VC++
ASSERT()
ASSERT (Подтверждение) позволяет Вам осуществлять проверку некоторых условий, которые всегда должны быть истинными. Например, если требуется, чтобы значение индекса i не выходило за границы массива, можно использовать такую конструкцию:
ASSERT (i>=0 && i<ARRAYSIZE) ,
где ARRAYSIZE - константа, определяющая количество элементов в этом массиве.
Если проверяемое условие будет нарушено, то выдается диалоговое окно с соответствующим предупреждающим сообщением. При нажатии в этом окне кнопки Retry (Повтор) осуществляется переход в режим отладки программы (если программа выполняется из среды программирования). Курсор при этом размещается на строке, где находится макрос ASSERT. Макрос assert() добавляет к программе процедуру диагностики. После выполнения, если выражение ложно (то есть, результат сравнения 0), assert() пишет информацию о вызове в поток stderr и вызывает функцию abort().
Примечание. ASSERT является макросом, а не функцией, поэтому он не заканчивается символом ";" (точка с запятой).
class CAge : public CObject
{
public:
unsigned int m_Age;
CAge(unsigned int Age) {m_Age = Age;}
};
// example for ASSERT
CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( pcage!= NULL )
// Terminates program only if pcage is NOT a CAge*.
VERIFY()
Макросы ASSERT() и VERIFY() очень похожи друг на друга, что часто приводит к недоразумениям. На самом деле между ними существует очень важное различие. В отладочных версиях макросы ASSERT() и VERIFY() работают одинаково. Оба макроса вычисляют выражение, переданное им в качестве аргумента, и прекращают работу программы с выводом сообщения в том случае, если это выражение оказывается равным нулю. Отличие заключается в том, что в окончательной версии макрос ASSERT() вместе с вычисляемым выражением полностью удаляется из кода. С другой стороны, выражение макроса VERIFY() остается в программе. Макрос ASSERT() предназначен для проверки состояния переменных, а VERIFY() — для проверки функций. Выражение макроса ASSERT() относится только к состоянию переменных и не является обязательной частью программы, поэтому его можно удалить из окончательной версии.
TRACE().
Другим макросом, который можно использовать при создании отладочной версии программы, является TRACE (Трассировка), который выводит отладочную информацию в окно, расположенное в нижней части экрана дисплея (вкладка Debug).
Существует несколько видов макроса TRACE: TRACE0 (или TRACE), TRACE1, TRACE2 и TRACE3. Число в имени указывает на число параметрических аргументов, следующих за строковой константой, что напоминает обычную функцию printf. Приведем примеры использования этого макроса:
TRACE ("Не создана панель инструментов!"); - пример макроса без параметрических аргументов;
TRACE1 ("Ошибка №%d\n",-1); - пример макроса с одним параметрическим аргументом;
TRACE2 ("Ошибка в файле %s, номер: %d\n", _FILE_, k); - пример макроса с двумя параметрическим аргументами.
// example for TRACE
int i = 1;
char sz[] = "one";
TRACE( "Integer = %d, String = %s\n", i, sz ); // d - Signed decimal integer
// Output: 'Integer = 1, String = one'
Cоздание пользовательского класса исключений в MFC
Для обработки исключительных ситуаций, возникающих в MFC, определен специальный класс CException.
Сам класс CException является абстрактным классом. Объекты такого класса создавать нельзя. Для обработки исключительных ситуаций, возникающих в MFC, используется классы наследованные от класса CException:
CMemoryException
При распределении оперативной памяти
CFileException
При работе с файлами
CArchiveException
Во время записи или восстановления объектов (Archive/Serialization)
CNotSupportedException
При обращении к неизвестный метод, который не поддерживается данным классом
CResourceException
Ошибка при работе с ресурсами Windows
CDaoException
Ошибка при работе с базами данных, через средства DAO
CDBException
Ошибка при работе с базами данных, через средства ODBC
COleException
Ошибка при работе OLE
COleDispatchException
Ошибка при работе OLE
CUserException
При обработке этого исключения на экране отображается сообщение, а затем вызывается исключение CException.
//Для создания пользовательского класса исключения создаем класс наследованынй от CException