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