bool TAsyncFile::CloseFile() – добавляет команду закрытия файла в очередь команд, возвращает false, если произошла ошибка (файл не открыт, файл уже закрыт, произошла ошибка чтения/записи), иначе true.
int TAsyncFile::GetResult() – возвращает текущее состояние объекта (значение переменной process_flags).
bool TAsyncFile::GetSyncFlag() – возвращает текущее значение флага разрешения синхронизируемых операций (sync_flag).
void TAsyncFile::SetSyncFlag(bool flag) – изменяет значение флага разрешения синхронизируемых операций (sync_flag). Если операции запрещены (false), то при получении функцией потока из очереди синхронизируемой операции происходит останов этой функции до момента установки флага sync_flag в значение true. Функция SetSyncFlag при занесении в флаг sync_flag значения true проверяет, не находится ли функция потока в состоянии ожидания разрешения, и если это так, разрешает ее выполнение.
__property bool SyncFlag – служит для более удобного доступа к флагу синхронизации. При записи происходит обращение к функции SetSyncFlag, при чтении – к GetSyncFlag.
__fastcall TAsyncFile::~TAsyncFile() – деструктор класса. При уничтожении объекта разрешает синхронизируемые операции; если файл еще не закрыт, добавляет в очередь команду закрытия файла; затем ждет закрытия, после чего уничтожает объект.
5. Рекомендации по использованию модуля и системные требования
Модуль асинхронного доступа к файлу предназначен для использования при написании программ на Borland C++ Builder версии 1 и выше. Это объясняется использованием в модуле класса TThread, содержащегося в его стандартной библиотеке VCL. Для использования модуля в проекте необходимо включить файл TAsyncFile.lib в проект и включить в исходный текст программы файл TAsyncFile.h командой #include. При этом будут автоматически подключены также файлы TSpisok.h, TTask.h.
При использовании функции асинхронного чтения файлов необходимо обязательно проверять завершение текущей операции перед тем, как использовать считанные данные. В обратном случае возможна попытка использовать данные из буфера чтения до того, как они будут туда помещены.
Для работы программы, содержащей модуль асинхронного доступа к файлу необходимо: наличие операционной системы Windows 95/98 (возможно использование Windows NT, однако это практически лишено смысла, так как в ней присутствуют встроенные возможности для асинхронной работы с файлами). Необходимо наличие свободной оперативной памяти для копии записываемых данных; это особенно актуально при работе с файлами на жестком диске, так как отсутствие свободного ОЗУ приведет к его освобождению с использованием swap-файла, что не только не ускорит, но и значительно замедлит асинхронную работу с файлом по сравнению с синхронной. В связи с этим рекомендуется использование памяти размером 16 Мб и более, в зависимости от размера самой программы и объема записываемых данных. При работе с гибким диском количество свободной памяти не оказывает такого сильного влияния, так как даже в случае свопинга скорость работы с гибким диском будет повышена. Поэтому рекомендуется при использовании асинхронного обмена с гибким диском объем оперативной памяти 8 Мб и более. Требования к процессору не столь жесткие, однако, чем больше его быстродействие, тем больший выигрыш в производительности можно получить при использовании асинхронного обмена.
6. Заключение и выводы
Данный модуль решает задачу асинхронного доступа к файлу в программах, написанных для Borland C++ Builder. Возможна также модификация программы и реализация потока с непосредственным использованием функций WinAPI, после чего возникнет возможность использования модуля с другими компиляторами. Возможно дальнейшее развитие и расширение сервисных функций модуля, развитие сообщений об ошибках и текущем состоянии процедуры обмена, введение возможности вывода форматированных данных с преобразованием (например, float à последовательность символов).
1. Подбельский В.К. «Язык C++».
2. C++ Builder Programmer’s Guide.
3. Microsoft Help Knowledge Base.
Листинг файла TSpisok.h
/* Класс связанного списка, использование:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.