Разработка класса, осуществляющего асинхронную работу с файлами, страница 5

break;

case 2://Закрытие файла

array=NULL;

break;

case 3://Чтение из файла

array=source;

break;

case 4://Синхронная запись в файл

array=new char[length];

for(i=0;i<length;i++)

array[i]=source[i];

break;

case 5://Синхронное чтение из файла

array=source;

break;

}

}

TTask::~TTask()

{   if(option==0||option==1||option==4)

delete array;

}

Листинг файла TAsyncFile.h

//--------------------------------------------------------------------------#ifndef TAsyncFileH

#define TAsyncFileH

#include"TTask.h"

#include"TSpisok.h"

//--------------------------------------------------------------------------class TAsyncFile: protected TThread

{ private:

bool access_flag;     //Флаг разрешения доступа основного

//процесса к списку задач

HANDLE hFile;         //HANDLE файла

int process_flags;    //Флаги ошибки, завершения работы и т.д.

//0 - процесс идет

//1 - произошла ошибка

//2 - текущие операции завершены, ждем новых указаний

//3 - файл закрыт

//4 - файл не открыт

//5 - ждем разрешения для начала синхронизируемой                             //    операции

int option;           //Тип открытия файла:

//0 - Write, CREATE_ALWAYS

//1 - Write, CREATE_NEW

//2 - Read, OPEN_EXISTING

TSpisok<TTask> *tasks;//Указатель на список задач

bool sync_flag;       //флаг разрешения синхронных операций

protected:

void __fastcall Execute();

public:

__fastcall TAsyncFile

(char *filename,int opt);//Конструктор с открытием файла

__fastcall TAsyncFile();            //Пустой конструктор

int GetResult();                    //Чтение флага состояния

bool CreateFile

(char *filename,int opt);//Открытие файла

bool WriteFile(void *buf,int numb); //Запись в файл

bool ReadFile(void *buf,int numb);  //Чтение из файла

bool CloseFile();                   //Закрытие файла

bool WriteSyncFile(void *buf,int numb);//Синхронная запись в файл

bool ReadSyncFile(void *buf,int numb); //Синхронное чтение из файла

bool GetSyncFlag();                   //Чтение флага разрешения синхронной                                          //операции

void SetSyncFlag(bool flag);          //Запись флага разрешения синхронной                                          //операции

__fastcall ~TAsyncFile();             //Деструктор

__property bool SyncFlag={read=sync_flag,write=SetSyncFlag,nodefault};

};

#endif

Листинг файла TAsyncFile.cpp

//--------------------------------------------------------------------------#include <vcl\vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "TAsyncFile.h"

//--------------------------------------------------------------------------__fastcall TAsyncFile::TAsyncFile(char *filename,int opt):TThread(true)

{     access_flag=false;

process_flags=0;    //Идет процесс, ошибок нет

option=opt;         //Тип файла

sync_flag=false;

tasks=new TSpisok<TTask>(new TTask(0,opt,filename));

//Команда открытия файла - в очередь

Suspended=false;    //Запуск обработки задания

}

__fastcall TAsyncFile::TAsyncFile():TThread(true)

{     access_flag=false;

process_flags=4;        //Файл не открыт

sync_flag=false;          //Запрет синхронных операций

tasks=new TSpisok<TTask>; //Пустая очередь заданий

}

bool TAsyncFile::CreateFile(char *filename,int opt)

{   if(process_flags!=4)

return false;

option=opt;

process_flags=0;

tasks->new_el(new TTask(0,opt,filename));

Suspended=false;

return true;

}

int TAsyncFile::GetResult()

{     return process_flags;

}

bool TAsyncFile::GetSyncFlag()

{     return sync_flag;

}

void TAsyncFile::SetSyncFlag(bool flag)

{     sync_flag=flag;

if(flag==true&&process_flags==5)

{   process_flags=0;

Suspended=false;

}

}

void __fastcall TAsyncFile::Execute()

{   int op,len;

DWORD x;

bool Ok;

char *arr;

while(true)

{     access_flag=true;

op=tasks->el(0).option;

len=tasks->el(0).length;

arr=tasks->el(0).array;

access_flag=false;//Выборка данных из очереди заданий

switch(op)

{ case 0://Открытие файла

if(option==0)

hFile=::CreateFile(     arr,

GENERIC_WRITE,

0,

NULL,

CREATE_ALWAYS,                                                          FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,

NULL);

if(option==1)