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

hFile=::CreateFile(     arr,

GENERIC_WRITE,

0,

NULL,

CREATE_NEW,

FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,

NULL);

if(option==2)

hFile=::CreateFile(     arr,

GENERIC_READ,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,

NULL);

if(hFile==INVALID_HANDLE_VALUE)

{     process_flags=1;//Ошибка, дальнейшая работа невозможна

Suspended=true;//Останов потока

}

break;

case 1://Запись в файл

if(process_flags!=1&&process_flags!=3)//Файл открыт и не закрыт

{     Ok=::WriteFile(    hFile,

arr,

len,

&x,

NULL);

if(!Ok)

{ process_flags=1;

Suspended=true;//Ошибка записи

}

}

else

Suspended=true;//Запись невозможна, тормозим поток

break;

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

if(process_flags!=1&&process_flags!=3)//Файл открыт и не закрыт

{     Ok=CloseHandle(hFile);

if(!Ok)

process_flags=1;//Ошибка закрытия файла

else

process_flags=3;//Файл закрыт

Suspended=true;

}

else

Suspended=true;//Запись невозможна, тормозим поток

break;

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

if(process_flags!=1&&process_flags!=3)//Файл открыт и не закрыт

{     Ok=::ReadFile(     hFile,

arr,

len,

&x,

NULL);

if(!Ok)

{ process_flags=1;

Suspended=true;//Ошибка чтения

}

}

else

Suspended=true;//Чтение невозможно, тормозим поток

break;

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

if(process_flags!=1&&process_flags!=3)//Файл открыт и не закрыт

{   while(!sync_flag)

{     process_flags=5;

Suspended=true;

}

Ok=::WriteFile(    hFile,

arr,

len,

&x,

NULL);

if(!Ok)

{ process_flags=1;

Suspended=true;//Ошибка записи

}

}

else

Suspended=true;//Запись невозможна, тормозим поток

break;

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

if(process_flags!=1&&process_flags!=3)//Файл открыт и не закрыт

{   while(!sync_flag)

{   process_flags=5;

Suspended=true;

}

Ok=::ReadFile(     hFile,

arr,

len,

&x,

NULL);

if(!Ok)

{ process_flags=1;

Suspended=true;//Ошибка чтения

}

}

else

Suspended=true;//Чтение невозможно, тормозим поток

break;

}

access_flag=true;

tasks->delete_el(0);

x=tasks->maxnumb();

access_flag=false;

if(x==0&&process_flags==0)

{   process_flags=2;

Suspended=true;

}

}

}

bool TAsyncFile::WriteFile(void *buf,int numb)

{   int i;

if(process_flags==1||process_flags==3||process_flags==4||option==2)

return false;

do

{ Suspended=true;

if(!access_flag)

break;

Suspended=false;

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

} while(true);

tasks->new_el(new TTask(1,numb,(char *)buf));

if(process_flags==2)

process_flags=0;

Suspended=false;

return true;

}

bool TAsyncFile::WriteSyncFile(void *buf,int numb)

{   int i;

if(process_flags==1||process_flags==3||process_flags==4||option==2)

return false;

do

{ Suspended=true;

if(!access_flag)

break;

Suspended=false;

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

} while(true);

tasks->new_el(new TTask(4,numb,(char *)buf));

if(process_flags==2)

process_flags=0;

Suspended=false;

return true;

}

bool TAsyncFile::ReadFile(void *buf,int numb)

{     int i;

if(process_flags==1||process_flags==3||process_flags==4||option!=2)

return false;

do

{ Suspended=true;

if(!access_flag)

break;

Suspended=false;

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

} while(true);

tasks->new_el(new TTask(3,numb,(char *)buf));

if(process_flags==2)

process_flags=0;

Suspended=false;

return true;

}

bool TAsyncFile::ReadSyncFile(void *buf,int numb)

{     int i;

if(process_flags==1||process_flags==3||process_flags==4||option!=2)

return false;

do

{ Suspended=true;

if(!access_flag)

break;

Suspended=false;

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

} while(true);

tasks->new_el(new TTask(5,numb,(char *)buf));

if(process_flags==2)

process_flags=0;

Suspended=false;

return true;

}

bool TAsyncFile::CloseFile()

{     bool x;

int i;

if(process_flags==1||process_flags==3||process_flags==4)

return false;

do

{ Suspended=true;

if(!access_flag)

break;

Suspended=false;

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

} while(true);

tasks->new_el(new TTask(2,0,NULL));

if(process_flags==2)

process_flags=0;

Suspended=false;

return true;

}

__fastcall TAsyncFile::~TAsyncFile()

{   SetSyncFlag(true);

if(process_flags==3||process_flags==1||process_flags==4)

{     delete tasks;

return;

}

CloseFile();

while(process_flags!=3&&process_flags!=1);

delete tasks;

return;

}