Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2012, 14:48   #21
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

to de-em

В идеале файл должен создаваться в том же самом потоке.
Но, т.к. мне необходимо закрыть предыдущий файл, то я обрываю поток
Код:
 {
 if(reader)		   //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки
  {TerminateThread(reader,0);
   CloseHandle(overlapped.hEvent);	//нужно закрыть объект-событие
   CloseHandle(reader);
  }
Конечно, это можно было сделать изящнее, пока делаю как есть.
После обрыва потока закрываю старый файл
Код:
myFile.Close();
И пытаюсь создать новый
Код:
newFile.Open("myfile.txt", CFile::modeCreate | CFile::modeWrite);
И после этого я должен возобновит поток (пока не сделал).
Затык в том, что файл не создается. А следовательно, писать поток некуда
bedouin вне форума Ответить с цитированием
Старый 20.09.2012, 15:13   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Мне не совсем понятно - зачем обрывать поток при закрытии файла? Закройте да откройте все в одном потоке (который читает из COM порта). Далее, у вас все время есть то myFile то newFile. В принципе должен быть один файловый объект и надо открывать и закрывать его в одном потоке, либо надо синхронизировать доступ в объекту, в противном случае могут случаться Плохие Вещи. Далее, посмотрите на последний, третий аргумент у CFile::Open и воспользуйтесь им. Наверняка есть код ошибки - надо посмотреть что ломается. Вы уверены, что поток уже закончен и файл уже закрыт?

Последний раз редактировалось waleri; 20.09.2012 в 15:16.
waleri на форуме Ответить с цитированием
Старый 06.10.2012, 10:55   #23
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Подправил код таким образом, чтобы можно было приостанавливать и стартовать поток при помощи Suspend/Resume, а не уничтожать его:
Создаю поток
Код:
reader = CreateThread(NULL, 0, ReadThread, NULL, CREATE_SUSPENDED, NULL);
ResumeThread(reader);
Процедура записи в файл:
Код:
void ReadPrinting()
{
 	if (GetFileSize(myFile,NULL) > 100000)
  {
    newFile.Open("newFile.txt", CFile::modeCreate | CFile::modeWrite);
   
    SuspendThread(reader);
     myFile.Close();
    ResumeThread(reader);

	}
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }

}
Файл newFile.txt создается.
Но для меня осталось непонятным, почему если я открытие/создание файла ставлю после приостановки потока и закрытия файла
Код:
{
    SuspendThread(reader);
    myFile.Close();
    ResumeThread(reader);

newFile.Open("newFile.txt", CFile::modeCreate | CFile::modeWrite);

	}
то ничего не работает (newFile.txt не создается)?
Если наоборот, то все идет. Из-за чего так происходит?
bedouin вне форума Ответить с цитированием
Старый 06.10.2012, 12:52   #24
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Да зачем останавливать и запускат поток?
Откройте COM порт
Создайте поток и передайте параметром HANDLE порта
В потоке откройте файл, циклично читайте из порта и пишите в файл. Если файл стал большим закройте файл и откройте новый.

Когда надо завершить программу из главного потока закройте COM порт, тогда чтение прервется ошибкой.
waleri на форуме Ответить с цитированием
Старый 06.10.2012, 23:08   #25
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Когда я закрываю файл, не обрывая поток, вываливается ошибка, ссылающаяся на файл filecore.cpp (номер строки не скажу, надо уточнить).
Она связана с некорректным закрытием файла.
Из-за этого программу периодически "выбивает", а мне надо, чтобы она писала файлы в цикле.
Вот поэтому я и "камасутрюсь" с потоком (его запуском и остановом).
bedouin вне форума Ответить с цитированием
Старый 07.10.2012, 00:04   #26
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я бы на вашем месте разобрался бы с вываливанием. Если это то вываливание, о котором шла речь пару страниц назад, то насколько я помню оно было связано с тем, что вы закрываете файл, который не был открыт, либо закрывается дважды.
waleri на форуме Ответить с цитированием
Старый 07.10.2012, 01:29   #27
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

ОК, перепроверю.
Хотя в прошлый раз ошибка уходила, когда перед тем, как закрыть файл, предварительно останавливал поток данных с порта.
Но пересмотрю код еще раз. Возможно это было совпадение
bedouin вне форума Ответить с цитированием
Старый 24.12.2012, 00:00   #28
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Доброго времени суток.
Извиняюсь, что выпал из жизни. После долгих мучений удалось реализовать следующий код:
Код:
void ReadPrinting()
{
 	if (GetFileSize(myFile,NULL) > 100000)
  {
 	myFile.Close(); 

	 //ПРОЦЕДУРА ФОРМИРОВАНИЯ ИМЕНИ ФАЙЛА
    
	newTime = CTime::GetCurrentTime(); 
   
	SYSTEMTIME lt;
GetLocalTime(&lt);

CString stroke;
stroke = "";
char temp[5];
// Преобразуем целое в строку в десятичном формате
itoa(lt.wYear, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wMonth, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wDay, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wHour, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wMinute, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wSecond, temp, 10);
stroke += temp;
stroke += ",";
itoa(lt.wMilliseconds, temp, 10);
stroke += temp;
stroke += ".dat";
	
	new_fileName = stroke;

   
    char new_data[30];
    strcpy(new_data,new_fileName);
    szNewFileName = new_data;
	
	myFile.Open(szNewFileName, CFile::modeCreate | CFile::modeWrite);
  
	}
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }

}
Функция позволяет производить запись нового (2-го) и последующего файлов, присваивая ему имя аналогично предыдущему (1-му):

ГГГГ-ММ-ДД-ЧЧ-ММ-СС,МСС.dat

Согласен, что код далек от идеала. Поэтому будет дорабатываться. Готов выслушать замечания и предложения.
Отдельное спасибо waleri за помощь.
Очень помог!
bedouin вне форума Ответить с цитированием
Старый 24.12.2012, 07:27   #29
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Что мешает копировать напрямую из stroke в szNewFileName?

У CString должен быть метод Format() - наверно будет лучше его использовать.
waleri на форуме Ответить с цитированием
Старый 24.12.2012, 11:55   #30
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Цитата:
Что мешает копировать напрямую из stroke в szNewFileName?
Наибольшие сложности при формировании имени у меня возникли с командой strcpy. Возможно, что я еще "плаваю" в форматах данных. Поэтому и получилась такая сложная конструкция:
Код:
    new_fileName = stroke;
    char new_data[30];
    strcpy(new_data,new_fileName);
    szNewFileName = new_data;
При случае попробую сделать присваивание напрямую.
Цитата:
У CString должен быть метод Format()
Не до конца понял, что Вы имели в виду.
Можно поподробнее
bedouin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
расшифровка данных, принятых с COM-порта IIUH Общие вопросы Delphi 25 12.04.2021 14:05
отправка/принятие данных с порта. romank26 Win Api 1 26.03.2012 12:51
Считка данных по-битно из COM порта Terran Общие вопросы Delphi 3 23.11.2011 04:19
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 10:39
Приём данных с com порта kyc0k Помощь студентам 3 28.03.2008 15:04