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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем KIG, 14 авг 2013.

  1. KIG

    KIG New Member

    Регистрация:
    14 авг 2013
    Сообщения:
    2
    Симпатии:
    0
    Добрый день.

    Пишу информацию в файлы (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)
    }
    При этом через некоторое время начинают создаваться пустые файлы, форма программы начинает просвечивать (комп подвисает). Подскажите, пожалуйста, что я делаю не так?
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Я честно пытался понять и найти ошибку - не получилось.

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

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

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

    KIG New Member

    Регистрация:
    14 авг 2013
    Сообщения:
    2
    Симпатии:
    0
    Спасибо! Нашлась ошибка.. надо было использовать _findclose() после _findfirst()
     
Загрузка...

Поделиться этой страницей