Размещение объектов в Delphi связано с более тесными отношениями между объектами и реальным программным кодом. Объекты помещаются в вашу форму, при этом код, отвечающий объектам, автоматически записывается в исходный файл. Этот код компилируется, обеспечивая существенно более высокую производительность, чем визуальная среда, которая интерпретирует информацию лишь в ходе исполнения программы.
Глава 2. Разработка алгоритмов
2.1. Разработка алгоритма
Глава 3. Эксплуатационная часть
3.1. Руководство программистa
В программе были применены, большое количество компонентов Windows, различные обработчик событий, процедуры и функции. При разработке программы было создано 3 модуля (Main, Diag, Example). В модуле Main былa примененa 1 процедурa.
Краткое описание основных использованных функций
Используем функцию GetComputerName для получения имени компьютера, функцию GetUserName для получения имени пользователя и функцию GetSystemInfo для получения информации о процессоре (наиболее полно данная функция реализована в Windows NT, где она возвращает и кол-во процессоров и их тип и т.д.).
Перейдем к параметрам экрану. Здесь мы будем использовать и Win32 API функции и стандартные объекты VCL. Так для получения разрешения экрана нам понадобится объект TScreen (его свойства Width и Height). Остальные параметры мы получим через контекст драйвера устройства DC используя функцию GetDeviceCaps.
Также будет интересна информация о памяти. Здесь нам поможет функция GlobalMemoryStatus, возвращающая информацию по объему физической и виртуальной памяти.
Узнаем информацию о ОС. Функция GetWindowsDirectory вернет путь к каталогу, где установлена система, функция GetSystemDirectory - к системному каталогу. Для определения версии ОС воспользуемся функцией GetVersionEx.
Опишем функцию BIOSInfo с параметром, характеризующем текущую ОС. Важно отметить, что способ получения информации о дате BIOS различен. Для NT получим информацию из реестра, а для Windows 95/98 из соответствующего участка памяти. Эти два способа взаимоисключаемы, так как у Windows 95/98 нет соответствующего раздела реестра, а прямой доступ к памяти в NT невозможен.
Рассмотрим функцию SystemParametersInfo, которая позволяет управлять некоторыми настройками системы. Область применения данной функции для NT и Windows 95/98 различна. Умышленно выберем некоторую общую часть для обеих систем.
Также можно позволить пользователю изменять и сохранять настройки системы по своему вкусу. Здесь можно использовать функцию SystemParametersInfo. Для компонентов tbKeyboardSpeed, tbKeyboardDelay, cbScreenSaverActive, cbSpeaker, edSSTimeOut в ObjectInspector перейдем на закладку Events и изменим событие OnChange (для tbKeyboardSpeed, tbKeyboardDelay) , OnClick (для cbScreenSaverActive, cbSpeaker) и OnExit для edSSTimeOut на Change.
Использование Delphi совместно c фунциями Microsoft Win32 API позволит программисту создать более функционально богатые и гибкие приложения.
Процедуры модуля Main:
procedure TForm11.Timer1Timer(Sender: TObject);
Данная процедура используется для показа сплэш-окна при начальной загрузке программы. После своего выполнения она показывает главную форму.
Процедуры модуля Diag:
procedure TDiadnostic.AboutClick(Sender: TObject);
Процедура выполняет функцию открытия окна или формы. Это то же можно реализовать двумя способами:
1) Form1.Show;
2) Form1.Visible:=True;
procedure GetPrName(processor1:Tlabel);
Процедура определяет тип процессора.
procedure GetRegInfoWinNT;
Процедура используется для получения информации из реестра Windows. В частности, используется для выода информации о Базовой Системе Ввода-Вывода.
В большинстве случаев очень важной оказывается информация о типе BIOS. Строка типа BIOS хранится по адресу 0FFA68, а строка даты BIOS по адресу 0FFFF5. Это физические адреса, следовательно адреса "сегмент:смещение": 0F000:FA68 и 0F000:FFF5.
При включении компьютера BIOS инициализирует свои ресурсы и ищет, начиная с адреса 0C0000, ПЗУ установленных карт. Каждое ПЗУ имеет подпись, которая символизируется байтами 55AAh, если BIOS находит эти байты, то он узнаёт размер ПЗУ, который хранится в следующем байте и содержит число страниц по 512 байт, после чего по возможности считает контрольную сумму этого ПЗУ (она должна быть равна нулю) и передаёт управление на 4-ый байт. Также BIOS считает контрольную сумму байт CMOS, расположенных в ячейках 10h-2Dh. Так как в этих ячейках хранится важная, для продолжения работы, информация и её повреждения недопустимы.
Исходя из этого, программа определяет тип BIOS и считает контрольные суммы Видео ПЗУ и CMOS.
function GetDisplayDevice: string;
данная функция определяет основные параметры видеокарты, такие как размер памяти и строку данных производителя.
function LocalIP : string;
данная функция возвращает IP адрес текущего компьютера.
Function GetCPUSpeed: Double;
Выясняем тактовую частоту процессора.
function CheckDriveType(ch:char): String;
возвращает тип диска (сменный, жесткий)
procedure TDiadnostic.FormCreate(Sender: TObject);
создает главное окно программы
function getprintername:string;
Возвращает имя принтера, сетевого или локального.
procedure TDiadnostic.Button4Click(Sender: TObject);
выполняет обновление информации о состоянии памяти
procedure TDiadnostic.disknameChange(Sender: TObject);
выполняет смену имени диска
procedure TDiadnostic.FormClose(Sender: TObject; var Action: TCloseAction);
Процедура выполняет функцию выхода из программы. Мгновенный выход из программы.
Выход из программы можно организовать несколькими способами, такими как:
- Application.Terminate;
- Form1.Hide;
- Form1.Visible:=False;
- Form1.Close;
Эти команды практически не отличаются друг от друга. Единственным различием может быть то, что первый выход работает гораздо быстрее, т.е. приложение закрывается мгновенно.
function OpenCD(Drive : Char) : Boolean;
выполняет функцию открытия сд-рома
function CloseCD(Drive : Char) : Boolean;
выполняет функцию закрытия сд-рома.
procedure TDiadnostic.SpeedButton1Click(Sender: TObject);
Процедура выполняет функцию открытия окна или формы. В данном случае открывается окно тестирования процессора.
Процедуры модуля Example:
procedure TForm1.Button1Click(Sender: TObject);
выполняет измерение тактовой частоты процессора.
Следует подробнее рассказать об идентификации процессора. Как известно, в процессорах пятого поколения, а также в некоторых четвёртого поколения, появилась команда CPUID. Эта команда позволяет больше узнать об установленном в системе процессоре. Обмен информацией происходит через основные регистры (EAX, EBX, ECX, EDX). Параметры задаются через регистр EAX. Таким образом, чтобы узнать информацию о версии процессора, я записал в EAX 1 и вызвал CPUID, после чего в EAX хранился результат. Для того, чтобы узнать производителя процессора, я записал в EAX 0 и вызвал CPUID, после чего в основных регистрах находится, уникальная для каждого производителя, строка. Для AMD это "AuthenticAMD", для Intel - "GenuineIntel", для Cyrix - "CyrixInstead". Теперь расскажу об идентификации процессоров, не имеющих инструкции CPUID. Понятно, что столь подробную информацию, в этом случае получить невозможно. Т.к. программа требует процессор не ниже третьего поколения, я начал проверку именно с этого поколения. Наличие 386-го процессора определяется недоступностью для записи 18-го бита регистра флагов, если бит доступен для записи, то я проверяю наличие поддержки команды CPUID, если она не поддерживается, то процессор 486-ой. Если же CPUID поддерживается, то дальше всё определение ложится именно на эту команду.
Наличие поддержки команды CPUID определяется доступностью для записи 21-го бита регистра флагов.
procedure TForm1.pcc2PrecizeProc(Sender: TObject);
используется для тестирования скорости выполнения арифметических операций, а именно для вычисления времени сложения 100 целых чисел.
procedure TForm1.pcc3PrecizeProc(Sender: TObject);
используется для вычисления времени сложения 100 целых 64-битных чисел.
procedure TForm1.pcc4PrecizeProc(Sender: TObject);
используется для сложения 100 вещественных чисел
procedure TForm1.Button2Click(Sender: TObject);
собственно выполняет 3 вышеперечисленных процедуры
procedure TForm1.pcc5PrecizeProc(Sender: TObject);
используется для тестирования скорости системной шины
procedure TForm1.Button3Click(Sender: TObject);
при нажатии данной кнопки процессор последовательно производит вычисления над 64-мя операциями NOP, расположенными в первом случае в памчти, во втором- в кэше, и потом вычисляет задержку на передачу команд из памяти.
procedure TForm1.Button4Click(Sender: TObject);
используется для тестирования скорости вызова приложения в оперативную память (вызывается блокнот).
procedure TForm1.pcc7PrecizeProc(Sender: TObject);
здесь тестируется скорость заполнения кэша
procedure TForm1.pcc8PrecizeProc(Sender: TObject);
выясняем количество тактов, необходимых для выполнения одной операции NOP
NOP - Пустая операция.
---------------------------------------------------------
O D I T S Z A P C
----------------------------------------------------------------¬
¦Код Инструкция Такты Описание ¦
¦операции ¦
+--------T---------T-----T-----T-----T------T-------------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86 ¦ ¦
+--------+---------+-----+-----+-----+------+-------------------+
¦90 ¦NOP ¦1 ¦3 ¦3 ¦3 ¦Нет операции. ¦
L--------+---------+-----+-----+-----+------+--------------------