C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Записываются пустые файлы  (Прочитано 1227 раз)
KIG
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 22


Записываются пустые файлы
« : 14 Август 2013, 11:03:22 »

Добрый день.

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

Код
 
void __fastcall dataprocessing::LogDPMtk(AnsiString LMtk)
{
FileRename(LogDPP,LogDP_Vlm);
 LogDP.open(LogDPP.c_str(),ios::app);//--- Добавил
  LogDPendlDateToStr(Time).c_str();
  LogDPendlTimeToStr(Time).c_str();
  LogDPendlLMtk.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);
 
LogDPDateToStr(Time).c_str()endl;
LogDPTimeToStr(Time).c_str()endl;
 
for (Log_ind=0; Log_indLen_mas; Log_ind++)
 LogDPIntToStr(Log_mas[Log_ind]).c_str()endl;
 
LogDPendlendl;
 
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);
 
  fileOscDateToStr(Time).c_str()";";
  fileOscTimeToStr(Time).c_str()";";
 
for(doz_ind=0; doz_ind55; 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];
 }
 
  fileOscendlendl;
 
fileOsc.close();
Logi("12",&GPS_K_st[0],70);
Control=0;
}
sleep(5);
}
while(!Terminated)
}
 
При этом через некоторое время начинают создаваться пустые файлы, форма программы начинает просвечивать (комп подвисает). Подскажите, пожалуйста, что я делаю не так?
« Последнее редактирование: 14 Август 2013, 11:40:31 от S0mbre » Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Записываются пустые файлы
« Ответ #1 : 14 Август 2013, 11:54:23 »

Что ж ты ждал? 33 потока, каждый выполняется бесконечно, с интервалом 5 миллисекунд! Для чего тебе так грузить систему?
Записан
KIG
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 22


Re: Записываются пустые файлы
« Ответ #2 : 14 Август 2013, 12:47:33 »

Не совсем так.. В теле одного доп потока dataprocessing пишется 33 файла через интервал 15 минут примерно (есть переменная Control, которая блокирует запись каждые 5 мс). Причем потоков типа ofstream LogDp 10 штук. Правильно ли я понимаю, необходимо завести лишь одну переменную типа ofstream LogDp и к ней поочередно подключать разные файлы или это необязательно???

И еще вопрос: почему если я использую много переменных (потоков) типа ofstream система виснет не сразу как включаю программу, а через три дня непрерывной работы?
Записан
Rius
Давний друг


Сказали спасибо: +116/-5
Offline

Сообщений: 753


Re: Записываются пустые файлы
« Ответ #3 : 14 Август 2013, 13:16:37 »

Цитировать
Не совсем так.. В теле одного доп потока dataprocessing пишется 33 файла через интервал 15 минут примерно (есть переменная Control, которая блокирует запись каждые 5 мс).
А вот и совсем так. Посмотрите внимательно:
Код
void __fastcall dataprocessing::Execute()
{
   do
   {
       if(Control)  
       {
           ...
           Control=0;
       }
       sleep(5);
   }
   while(!Terminated)
}
Цикл крутится быстро и бесконечно, независимо от Control.
Записан
KIG
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 22


« Ответ #4 : 14 Август 2013, 13:36:42 »

Всем спасибо! забыл поставить _findclose(res);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.062 секунд. Запросов: 21.