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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.