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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2023, 19:10   #1
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
Вопрос Работа с TFileStream виснет

Доброго времени!

Столкнулся со странным поведением потоков данных:

Код:
procedure TLog.ProcessLog;
begin
  writeln('reading log');
  ReadLog();
  writeln('processing log');

  for var i := LastLine to sl.Count - 1 do
    {some work}

  LastLine := sl.Count;
end;

procedure TLog.ReadLog;
begin
  fs := TFileStream.Create(LogName, fmOpenRead or fmShareDenyNone);
  try
    sl.LoadFromStream(fs, TEncoding.UTF8);
    writeln('loaded');
  finally
    FreeAndNil(fs);
  end;
end;
Процедура ProcessLog вызывается каждый раз при изменении файла, сама она находится в критической секции. Странность заключается в том, что ReadLog срабатывает ровно 4 раза, всегда, до перезапуска программы. То есть выводится надпись "reading log" и всё. Проблемная строка - sl.LoadFromStream(fs, TEncoding.UTF8);. Программа просто не хочет идти дальше. Никаких ошибок, надпись "loaded" не выводится, как и прочие обёртки вроде try .. except, как будто на этой строке бесконечный цикл.

В чём может быть проблема? И почему именно 4 раза?

P.S. Если чем-то поможет: это всё внутри библиотеки. Библиотека не выгружается в этот момент, судя по параллельному потоку, который подаёт признаки жизни. sl - глобальный TStringList класса TLog, создаётся в конструкторе класса, уничтожается в деструкторе.

Последний раз редактировалось cs12; 29.04.2023 в 19:17.
cs12 вне форума Ответить с цитированием
Старый 29.04.2023, 22:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1. в критической секции.
2. в доступе у файлу.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.04.2023, 23:10   #3
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
По умолчанию

evg_m,
1. Она, по сути, бесполезна, потому что с файлом работает только один поток.. да и освобождение происходит в секции finally. Но вообще, если бы в ней была проблема, до проблемной строки программа бы вообще не дошла.
2. Ну не может же доступа не быть всё время, рано или поздно файл всегда закрывается. Если файл удалить и создать заново, снова начать заполнять - ничего не меняется.
cs12 вне форума Ответить с цитированием
Старый 29.04.2023, 23:20   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А что не нравится в sl.LoadFromFile напрямую?
macomics вне форума Ответить с цитированием
Старый 29.04.2023, 23:27   #5
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
По умолчанию

macomics, стандартная блокировка fmShareDenyWrite. К слову, смысла в этом немного, потому что проблема та же
cs12 вне форума Ответить с цитированием
Старый 29.04.2023, 23:34   #6
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
По умолчанию

Решил заменить проблемную строку кодом из-под капота, чтобы определить, что именно застревает. После определения размера файла идёт выделение буфера под него SetLength(Buffer, Size); - тут и зависает. Дальше не докопаться, уже в систему глубоко уходит. Программа просто не получает место на запрос, и неясно, почему. Просто вечно ждёт.
cs12 вне форума Ответить с цитированием
Старый 30.04.2023, 00:08   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так может лучше заменить этот код на работу с системной кучей или маппингом файла?
macomics вне форума Ответить с цитированием
Старый 30.04.2023, 00:28   #8
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
По умолчанию

macomics, да я вроде попытался
cs12 вне форума Ответить с цитированием
Старый 30.04.2023, 01:17   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

cs12, вроде?
macomics вне форума Ответить с цитированием
Старый 30.04.2023, 11:04   #10
cs12
Пользователь
 
Регистрация: 23.03.2014
Сообщений: 24
По умолчанию

macomics, ага
cs12 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TFileStream cb251132 Общие вопросы Delphi 16 06.10.2020 14:12
TFileStream Baburek C++ Builder 3 04.07.2013 10:13
Работа со списками + виснет byshido Общие вопросы C/C++ 1 04.01.2011 19:40
Простая работа с потоками TFileStream exzibit Общие вопросы Delphi 2 27.02.2010 01:12
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22