• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

Записываются Пустые Файлы

KIG

New member
14.08.2013
2
0
#1
Добрый день.

Пишу информацию в файлы (33 файла) периодически (интервал 10 минут). Запись выполняю в теле дополнительного потока следующим образом (остальные файлы пишутся аналогично):

C++:
void __fastcall dataprocessing::LogDPMtk(AnsiString LMtk)
{
FileRename(LogDPP,LogDP_Vlm);
LogDP.open(LogDPP.c_str(),ios::app);//--- Добавил
LogDP<<endl<<DateToStr(Time).c_str();
LogDP<<endl<<TimeToStr(Time).c_str();
LogDP<<endl<<LMtk.c_str()<<endl;
LogDP.close();
}
//---------------------------------------------------------------------------
void __fastcall dataprocessing::Logi(char g[], int*Log_mas, int Len_mas)
{
int Log_ind;
CurrentFile_log=ExtractFilePath(Application->ExeName)+"Архив №"+Form1->Table1->FieldByName("ID")->AsString+"\\Logs\\Log №"+g+".txt";;
FileRename(CurrentFile_log,1000000);

LogDP.open(CurrentFile_log.c_str(),ios::app);

LogDP<<DateToStr(Time).c_str()<<endl;
LogDP<<TimeToStr(Time).c_str()<<endl;

for (Log_ind=0; Log_ind<Len_mas; Log_ind++)
LogDP<<IntToStr(Log_mas[Log_ind]).c_str()<<endl;

LogDP<<endl<<endl;

LogDP.close();
LogDPMtk(" Logi ");
}

void __fastcall dataprocessing::FileRename(AnsiString FileName1, long FileVolume1) //FileVolume1 - в байтах задается
{
if (FileExists(FileName1.c_str()))
{
AnsiString CFileNew=FileName1;
long FileLen = 0; struct _finddata_t fData;
int res = _findfirst(CFileNew.c_str(), &fData);
if (res > 0) FileLen = fData.size;
if(FileLen>FileVolume1)
{
CFileNew.Insert("_"+DateToStr(Time)+"_"+TimeToStr(Time),CFileNew.Length()-3);
CFileNew=StringReplace(CFileNew,":",".",TReplaceFlags()<<rfReplaceAll);
CFileNew[CFileNew.Pos(".")]=':';
RenameFile( FileName1.c_str(),CFileNew.c_str() );
}
}
}

void __fastcall dataprocessing::Execute()
{
do {
if(Control) 
{
FileRename(CurrentFile_Co,1000000);

fileOsc.open (CurrentFile_Co.c_str(),ios::app);

fileOsc<<DateToStr(Time).c_str()<<";";
fileOsc<<TimeToStr(Time).c_str()<<";";

for(doz_ind=0; doz_ind<55; doz_ind++)
{
if(GPS_K_st[doz_ind]==0)
{ fileOsc<<"0"; GPS_K_st[doz_ind]='!'; LogDPMtk(" K1 ");}
else fileOsc<<(char)GPS_K_st[doz_ind];
}

fileOsc<<endl<<endl;

fileOsc.close();
Logi("12",&GPS_K_st[0],70);
Control=0;
}
sleep(5);
}
while(!Terminated)
}
При этом через некоторое время начинают создаваться пустые файлы, форма программы начинает просвечивать (комп подвисает). Подскажите, пожалуйста, что я делаю не так?
 
R

rrrFer

#2
Я честно пытался понять и найти ошибку - не получилось.

Может быть упростить этот код (что-нибудь выкинуть) и попробовать повторить ошибку?

Я например не понял че за FileRename и в какой функции в каком порядке вы пишите в файл.

Может быть ошибка именно в потоках, а не в приведенных фрагментах? - у Вас точно каждый поток пишет в свой собственный файл (тут как-то непрозрачно имена разруливаются)? - если нет - то могут быть гонки и т.п. (в них и причина, возможно).
 

KIG

New member
14.08.2013
2
0
#3
Я честно пытался понять и найти ошибку - не получилось.

Может быть упростить этот код (что-нибудь выкинуть) и попробовать повторить ошибку?

Я например не понял че за FileRename и в какой функции в каком порядке вы пишите в файл.

Может быть ошибка именно в потоках, а не в приведенных фрагментах? - у Вас точно каждый поток пишет в свой собственный файл (тут как-то непрозрачно имена разруливаются)? - если нет - то могут быть гонки и т.п. (в них и причина, возможно).
Спасибо! Нашлась ошибка.. надо было использовать _findclose() после _findfirst()