Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mlr_EVM v ASUTP_3.0.doc
Скачиваний:
5
Добавлен:
10.02.2016
Размер:
201.73 Кб
Скачать

Программная реализация

Создайте новый проект «HDDTest» на основе диалогового окна. Перейдите в окноResourceViewи раскройте элемент дереваDialog. Откройте шаблон диалогаIDD_HDDTEST_DIALOGв окне редактора. Не забудьте установить для шаблона русский язык.

Вставьте в панель диалога элементы управления так, как это показано на рис. 1.

Элементам управления присвойте следующие идентификаторы. Элементу редактирования текста (Edit Box):IDC_ESIZE. Списку (List Box):IDC_LPROTO. Кнопке (Button):IDC_BSTART. Выключите у списка свойство «Sort».

Введите в класс CHDDTestDlgпеременные, позволяющие управлять содержимым диалогового окна.

Идентификатор

Тип

Имя переменной

IDC_ESIZE

int

m_nSize

IDC_LPROTO

CListBox

m_Proto

Рис.1. — Вид шаблона диалога

Создайте заготовку для обработчика функции OnBstart().

Далее мы рассмотрим два варианта реализации алгоритма определения скорости записи на жесткий диск: с использованием функции GetTickCount()и с использованием таймера высокого разрешения (функцииQueryPerformanceСounter()иQueryPerformanceFrequency()).

Реализация на основе функции GetTickCount()

Итак, для определения производительности жесткого диска, нам необходимо записать на него данные. Мы можем это сделать, выводя данные в файл. Для работы с файлами существует несколько различных наборов функций. Мы воспользуемся функциями CreateFile(), WriteFile()иCloseHandle().

Создание и открытие файла будем осуществлять с помощью функции CreateFile():

HANDLE CreateFile(

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile );

где

lpFileName— указатель на строку содержащую имя и путь к файлу;

dwDesiredAccess— флаги доступа к файлу (для записи, для чтения и др.);

dwShareMode— флаги определяющие общий доступ к файлу;

lpSecurityAttributes— атрибуты безопасности;

dwCreationDisposition— флаги определяющие способ создания файла;

dwFlagsAndAttributes— флаги задающие свойства созданного файла;

hTemplateFile— шаблон файла на основании каких свойств создавать новый файл.

Для записи в файл используем функцию WriteFile():

BOOL WriteFile(

HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped );

где

hFile— манипулятор созданного файла;

lpBuffer— указатель на буфер с данными для записи в файл;

nNumberOfBytesToWrite— количество байт для записи;

lpNumberOfBytesWritten— по этому адресу возвращается количество записанных байт;

lpOverlapped— данные для перекрытого ввода/вывода.

Функция возвращает не нулевое значение в случае успешной записи в файл.

После окончания работы с файлом нам необходимо будет его закрыть с помощью функции CloseHandle():

BOOL CloseHandle( HANDLE hFile );

где

hFile– манипулятор закрываемого файла.

Функция возвращает ненулевое значение в случае успешного закрытия файла.

Теперь нам осталось решить вопрос измерения времени. Для этого будем использовать функцию GetTickCount(). Прототип функции:

DWORD GetTickCount(void);

Она возвращает количество миллисекунд прошедших с момента старта компьютера.

С учетом всего вышеизложенного, обработчик OnBstart()будет выглядеть следующим образом.

void CHDDTestDlg::OnBstart()

{

// TODO: Add your control notification handler code here

UpdateData( true );

doubledSpeed;// скорость записи на диск

double dWriteTime; // время записи на диск

charszBuf[255];// строковый буфер для вывода информации

DWORDdwNumberOfBytesWritten;// количество записанных в файл байт

// динамически создаем буффер для записи

char *pFileBuf = new char [m_nSize];

// заполняем буффер данными (все равно какими). В данном случае символом ‘a’

memset(pFileBuf, ‘a’,m_nSize);

// Создаем файл

HANDLE hFile = CreateFile( "C:\\file.dat", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

// фиксируем время начала записи

DWORD dwTime = GetTickCount();

// записываем данные в файл

WriteFile( hFile, pFileBuf, m_nSize, &dwNumberOfBytesWritten, NULL );

// вычисляем продолжительность записи

dWriteTime = ( GetTickCount() –dwTime) / 1000.;

// Закрываем файл

CloseHandle(hFile);

// удаляем буффер

delete[]pFileBuf;

// удаляем файл

DeleteFile( "C:\\file.dat" );

// проверяем не равен ли знаменатель нулю. Это может случиться в том случае

// когда размер данных слишком мал и разрешающей способности функции

// GetTickCount() не достаточно, чтобы зафиксировать длительность процесса

// записи

if ( dwTime == 0 )

{

sprintf(szBuf, "Малый размер данных" );

}

else

{

// рассчитываем скорость записи на диск в МБт/с

dSpeed=m_nSize/ (dWriteTime * 1000000. );

sprintf(szBuf, "Скорость записи: %.4gМБт/с",dSpeed);

}

m_Proto.AddString( szBuf );

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]