Topic: Stream read error — TMemoryStream (Read 16722 times)
Hi,
I’ve problem with reading some file with TMemoryStream.LoadFromFile.
I can load files with size 8MB, 12MB, 15.8MB, but for example file with size > 22.7MB cause «stream read error» exception.
Is TMemoryStream has memory limitations?
Logged
It should go fine to at least 2 GB depending on if any variable is integer, otherwise 4 GB. Maybe small error in code?
Logged
It should go fine to at least 2 GB depending on if any variable is integer, otherwise 4 GB. Maybe small error in code?
the point is that the code is clear:
procedure RDFile;
var
pp: TMemoryStream;
begin
pp:=TMemoryStream.Create;
pp.LoadFromFile('C:bigFile.rar');
end;
smaller files read ok.
Logged
but if I use TFileStream with TMemoryStream then it’s ok
procedure RDFile;
var
pp: TMemoryStream;
oo: TFileStream;
begin
oo:=TFileStream.Create('C:bigFile.rar',fmOpenRead);
pp:=TMemoryStream.Create;
pp.LoadFromStream(oo);
end;
???
Logged
procedure TForm1.FormCreate(Sender: TObject);This works just fine for me, no errors.
var ms: TMemoryStream;
begin
ms:=TMemoryStream.Create;
ms.LoadFromFile('E:Nettitest.zip'); // This is 290Mb file
ms.Free;
end;
Maybe you’re forgetting to .Free your streams and they remain open on disk after program exits? Meaning it may have worked somehow for first time but not for the next. Freepascal carbage collection may not automatically free objects you leave open from procedures, right?
« Last Edit: October 06, 2011, 02:44:04 pm by User137 »
Logged
Free Pascal has no garbage collector at all.
strings and dynamic arrays are ref-counted, which is something different from garbage collection, but it also automatically frees these entities.
Objects like TMemoryStream are never automatically freed, you need to free them yourself.
Logged
OK. I found what is the problem.
In the example I gave not exactly real path. I use ‘Z:bigFile.rar’ where Z is mapped drive !!!
And that’s the problem. If I load file from C: then it’s ok, if I load from Z: (map net drive) I get error.
So my app, can crash in that situation. Bug in streams ?
Logged
Did you find any solution? I have the same problem with latest trunk. Loading stream from local drive works fie but loading from network drive or virtual under VirtualBox gives the error «Unable to open file…»
Logged
Debian Testing x64, XFCE 4.16 / Windows 10 PL — latest updates
Lazarus 2.2.0, FPC 3.2.2
|
1 / 1 / 0 Регистрация: 27.03.2018 Сообщений: 93 |
|
|
1 |
|
|
23.05.2020, 11:58. Показов 3480. Ответов 7
Подскажите, что делаю не так.
__________________
0 |
|
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 7 |
|
|
23.05.2020, 12:22 |
2 |
|
Как именно в БД загружаются изображения?
0 |
|
1 / 1 / 0 Регистрация: 27.03.2018 Сообщений: 93 |
|
|
23.05.2020, 12:33 [ТС] |
3 |
|
через Lazarus загрузку пока не реализовал. Загружаю через Firebird напрямую в таблицу
0 |
|
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 7 |
|
|
23.05.2020, 12:42 |
4 |
|
Вот отсюда и проблема. Когда будет загружено через Лазарус — будет работать.
0 |
|
1 / 1 / 0 Регистрация: 27.03.2018 Сообщений: 93 |
|
|
23.05.2020, 12:47 [ТС] |
5 |
|
ищу реализацию загрузки картинки по кнопке. может подскажите где посмотреть?
0 |
|
Супер-модератор 32451 / 20945 / 8105 Регистрация: 22.10.2011 Сообщений: 36,213 Записей в блоге: 7 |
|
|
23.05.2020, 12:52 |
6 |
|
Решение
1 |
|
1 / 1 / 0 Регистрация: 27.03.2018 Сообщений: 93 |
|
|
23.05.2020, 14:56 [ТС] |
7 |
|
Спасибо огромное. Работает. Миниатюры
0 |
|
1 / 1 / 0 Регистрация: 27.03.2018 Сообщений: 93 |
|
|
23.05.2020, 15:25 [ТС] |
8 |
|
и еще… 1. От первого, после открытия проги, клика «Добавить фото» до открытия окна проходит примерно 15 секунд, последующие добавления — около 5 секунд. Это решимо?
0 |
Модераторы: alexs, Модераторы
Виснет RxVersionInfo
Начиная с какого-то транка лазаря при запуске программы вылетает ошибка Stream read error
Ссылается на процедуру
- Код: Выделить всё
procedure TRxVersionInfo.DoVersionInfo(V: TVersionResource);
var
i,j:integer;
begin
for i:=0 to V.StringFileInfo.Count-1 do
begin
for j:=0 to V.StringFileInfo[i].Count-1 do
FValues.Values[V.StringFileInfo[i].Keys[j]]:=SysToUTF8(V.StringFileInfo[i].ValuesByIndex[j]);
end;
end;
Если внутренность процедуры закомментарить, то программа нормально стартует, но версию свою есссссссно не кажет.
Такая же бяка и с примером из папки demos.
-
Little_Roo - энтузиаст
- Сообщения: 632
- Зарегистрирован: 27.02.2009 19:56:36
- Откуда: Санкт-Петербург
Re: Виснет RxVersionInfo
alexs » 27.10.2017 16:12:51
Lazarus 1.9.0 r56213M FPC 3.1.1 i386-win32-win32/win64
Нормально
Пример сам себя верно определяет.
-
alexs - долгожитель
- Сообщения: 4009
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
-
- Профиль
- Сайт
- ICQ
Re: Виснет RxVersionInfo
Little_Roo » 27.10.2017 17:16:51
Методом быстрого художественного тыка —
если в параметрах проекта — Сведения о версии — Comments есть русские символы, то номер версии не выводится —
B CompanyName кириллица — stream read error
Убрал из проекта все, кроме FileVersion — взлетело
Lazarus 1.9.0 r56180 FPC 3.1.1 i386-win32-win32/win64
-
Little_Roo - энтузиаст
- Сообщения: 632
- Зарегистрирован: 27.02.2009 19:56:36
- Откуда: Санкт-Петербург
Re: Виснет RxVersionInfo
alexs » 27.10.2017 17:37:14
Всё работает
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
if RxVersionInfo1.Valid then
begin
Memo1.Lines.Add('FileName = ' + RxVersionInfo1.FileName);
Memo1.Lines.Add('FileLongVersion = '+RxVersionInfo1.FileLongVersion);
Memo1.Lines.Add('ProductLongVersion = '+RxVersionInfo1.ProductLongVersion);
Memo1.Lines.Add('VersionLanguage = '+RxVersionInfo1.VersionLanguage);
Memo1.Lines.Add('VersionCharSet = '+RxVersionInfo1.VersionCharSet);
Memo1.Lines.Add('VersionNum = '+RxVersionInfo1.VersionNum.ToString);
Memo1.Lines.Add('Comments = '+RxVersionInfo1.Comments);
Memo1.Lines.Add('CompanyName = '+RxVersionInfo1.CompanyName);
Memo1.Lines.Add('FileDescription = '+RxVersionInfo1.FileDescription);
Memo1.Lines.Add('FileVersion = '+RxVersionInfo1.FileVersion);
Memo1.Lines.Add('InternalName = '+RxVersionInfo1.InternalName);
Memo1.Lines.Add('LegalCopyright = '+RxVersionInfo1.LegalCopyright);
Memo1.Lines.Add('LegalTrademarks = '+RxVersionInfo1.LegalTrademarks);
Memo1.Lines.Add('OriginalFilename = '+RxVersionInfo1.OriginalFilename);
Memo1.Lines.Add('ProductVersion = '+RxVersionInfo1.ProductVersion);
Memo1.Lines.Add('ProductName = '+RxVersionInfo1.ProductName);
Memo1.Lines.Add('SpecialBuild = '+RxVersionInfo1.SpecialBuild);
Memo1.Lines.Add('PrivateBuild = '+RxVersionInfo1.PrivateBuild);
end
else
Memo1.Lines.Add('Ошибка чтения');
end;
- Вложения
-
- aaa.png (9.92 КБ) Просмотров: 8200
-
alexs - долгожитель
- Сообщения: 4009
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
-
- Профиль
- Сайт
- ICQ
Re: Виснет RxVersionInfo
Little_Roo » 27.10.2017 17:57:09
Мистика
-
Little_Roo - энтузиаст
- Сообщения: 632
- Зарегистрирован: 27.02.2009 19:56:36
- Откуда: Санкт-Петербург
Re: Виснет RxVersionInfo
alexs » 30.10.2017 09:31:18
Рекомендую проверить целостность всех данных. Ресурсы не битые?
Ну и я проверял на последних сборках FPC и Lazarus
-
alexs - долгожитель
- Сообщения: 4009
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
-
- Профиль
- Сайт
- ICQ
Re: Виснет RxVersionInfo
Little_Roo » 01.11.2017 14:30:18
Даже на пустом проекте (с одной строкой)
- Код: Выделить всё
Label1.Caption:=RxVersioninfo1.CompanyName;
в конце выводится квадрат
На незаполненном поле — только квадрат….Это касается и, к примеру, FileVersion…
Все транковое — Rx svn 6050
Lazarus 1.9.0 r56244 FPC 3.1.1 i386-win32-win32/win64
…
Блин, это почему-то только на ХР… на Вынь7 все корректно
-
Little_Roo - энтузиаст
- Сообщения: 632
- Зарегистрирован: 27.02.2009 19:56:36
- Откуда: Санкт-Петербург
Вернуться в RxLib
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
#1 29 марта 2021 09:58:31
- Dyaka
- Участник
- Неактивен
- На форуме с 29 марта 2021
- Сообщений: 5
Тема: Ошибка Stream Read Error
Добрый день! Не нашел решения проблемы по данному вопросу. При входе в программу и выполнении любого действия у пользователя вылетает ошибка Stream read error. У остальных пользователей все нормально. Переустановка не помогает.
#2 Ответ от Олег Зырянов 29 марта 2021 10:07:56
- Олег Зырянов
- Технический руководитель
- Неактивен
- Откуда: Новосибирск
- На форуме с 10 декабря 2008
- Сообщений: 4,183
Re: Ошибка Stream Read Error
Здравствуйте! Запустите конфигурацию TechnologiCS с ключом /skipreg или удалите вручную *.cfg файлы https://help.technologics.ru/7.9/TCSHelp/_876.htm
Больше всего похожена это. Хотя. Что значит при выполнении любого действия? Программа то работает в итоге?
#3 Ответ от Dyaka 29 марта 2021 10:58:21
- Dyaka
- Участник
- Неактивен
- На форуме с 29 марта 2021
- Сообщений: 5
Re: Ошибка Stream Read Error
Олег Зырянов пишет:
Здравствуйте! Запустите конфигурацию TechnologiCS с ключом /skipreg или удалите вручную *.cfg файлы https://help.technologics.ru/7.9/TCSHelp/_876.htm
Больше всего похожена это. Хотя. Что значит при выполнении любого действия? Программа то работает в итоге?
Работает, пользователь логинится, но после каждого действия вылетает данная ошибка. Запуск с ключом и удаление .cfg файлов не помогло
#4 Ответ от Олег Зырянов 29 марта 2021 11:06:08
- Олег Зырянов
- Технический руководитель
- Неактивен
- Откуда: Новосибирск
- На форуме с 10 декабря 2008
- Сообщений: 4,183
Re: Ошибка Stream Read Error
А можно точную версию TechnologiCS , и более подробное описание того что просходит, послеlовательно по шагам.
В идеале чтобы шаги эти повторялись, а не были случайными. То есть делаем — ошибка. Еще раз делаем — та же ошибка. Перезапустили TCS, повторяем -снова ошибка эта.
#5 Ответ от Dyaka 29 марта 2021 11:17:06
- Dyaka
- Участник
- Неактивен
- На форуме с 29 марта 2021
- Сообщений: 5
Re: Ошибка Stream Read Error
Олег Зырянов пишет:
А можно точную версию TechnologiCS , и более подробное описание того что просходит, послеlовательно по шагам.
В идеале чтобы шаги эти повторялись, а не были случайными. То есть делаем — ошибка. Еще раз делаем — та же ошибка. Перезапустили TCS, повторяем -снова ошибка эта.
У пользователя версия 5.7.0.0. Я не большой эксперт этой программы, опишу, как могу. Пользователь логинится, программа загружается, пишет о новых сообщениях, закрываем окно, и вылетает окошко с ошибкой Stream read error. Пользователь его закрывает, делает любой отчет, макрос, ошибка снова вылетает, но действие выполняется. В целом, все работает, просто после каждого действия пользователя с момента входа вылетает окошко с ошибкой.
#6 Ответ от Олег Зырянов 29 марта 2021 11:28:08
- Олег Зырянов
- Технический руководитель
- Неактивен
- Откуда: Новосибирск
- На форуме с 10 декабря 2008
- Сообщений: 4,183
Re: Ошибка Stream Read Error
Можно еще скриншот ошибки.
И… Если пользователье ничего не делает, просто откроет справочник на просмотр, ну и допустим просто иногда открывает форму редактирования, ничего не меняет, закрывает (то есть режим просмотр). Ошибка будет?
#7 Ответ от Dyaka 29 марта 2021 11:39:40 (изменено: , 29 марта 2021 11:39:40)
- Dyaka
- Участник
- Неактивен
- На форуме с 29 марта 2021
- Сообщений: 5
Re: Ошибка Stream Read Error
Олег Зырянов пишет:
Можно еще скриншот ошибки.
И… Если пользователье ничего не делает, просто откроет справочник на просмотр, ну и допустим просто иногда открывает форму редактирования, ничего не меняет, закрывает (то есть режим просмотр). Ошибка будет?
Извиняюсь за качество, как прислали мне. После закрытия окна ошибки и простого просмотра форм ошибка не возникает. Когда пользователь подписывает какой-то документ она снова появляется. При этом документ подписывается (последнее со слов пользователя).
Олег Зырянов пишет:
Можно еще скриншот ошибки.
И… Если пользователье ничего не делает, просто откроет справочник на просмотр, ну и допустим просто иногда открывает форму редактирования, ничего не меняет, закрывает (то есть режим просмотр). Ошибка будет?
Post’s attachments
image0011.jpg
image0011.jpg 27.33 Кб, 6 скачиваний с 2021-03-29
You don’t have the permssions to download the attachments of this post.
#8 Ответ от Олег Зырянов 30 марта 2021 08:11:54
- Олег Зырянов
- Технический руководитель
- Неактивен
- Откуда: Новосибирск
- На форуме с 10 декабря 2008
- Сообщений: 4,183
Re: Ошибка Stream Read Error
А скажите еще полную версию. До билда.
В 5.7 была нехорошая ошибка,правда вряд ли она бы так проявлялась, но все же.
#9 Ответ от Dyaka 30 марта 2021 14:29:37
- Dyaka
- Участник
- Неактивен
- На форуме с 29 марта 2021
- Сообщений: 5
Re: Ошибка Stream Read Error
Олег Зырянов пишет:
А скажите еще полную версию. До билда.
В 5.7 была нехорошая ошибка,правда вряд ли она бы так проявлялась, но все же.
10968
#10 Ответ от Олег Зырянов 30 марта 2021 15:32:51
- Олег Зырянов
- Технический руководитель
- Неактивен
- Откуда: Новосибирск
- На форуме с 10 декабря 2008
- Сообщений: 4,183
Re: Ошибка Stream Read Error
Есть новее на сайте, но не критично наверное http://www.technologics.ru/download/addition/v5.html.
Давайте еще версию операционной системы и содержимое файла csdn.ini (тот что в папке программы и тот что в профиле пользователя — точно не подскажу, 5.7 старая и как она точно работает уже мало кто помнит)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
I’m getting this error message under heavy load. Here is code abstract and message from my error log.
I tried everything I could think of. Any suggestion would be greatly appreciated.
Procedure tCacheInMemory.StreamValue(Name: String; IgnoreCase: Boolean; Var Stream: TStringStream);
Var
i: Integer;
Begin
i := 0;
Try
If Not active Then
exit;
arrayLock.BeginRead;
Try
i := Search(Name);
If i > -1 Then Begin
If fItems[i].value = Nil Then
exit;
fItems[i].value.Position := 0;
Stream.Position := 0;
Stream.CopyFrom(fItems[i].value, fItems[i].value.Size);
End;
Finally
arrayLock.EndRead;
End;
Except { ...execution jumps to here }
On E: Exception Do Begin
x.xLogError('LogErrorCacheInMemory.txt', 'StreamValue:' + E.Message + ' ItemsCount:' + IntToStr( High(fItems)) + 'Memory:' + IntToStr(x.GetMemoryInfoMemory) + endLn + 'StreamSize : ' + IntToStr(fItems[i].value.Size) + ' i=' + IntToStr(i) + 'Name: ' + Name);
Clear;
End
End;
End;
Log Entries:
3/10/2011 10:52:59 AM: StreamValue:Stream read error ItemsCount:7562 Memory:240816
StreamSize : 43 i=7506 Name: \xxxxxxxxWebRoot\images1x1.gif
3/10/2011 12:39:14 PM: StreamValue:Stream read error ItemsCount:10172 Memory:345808
StreamSize : 849 i=10108 Name: \xxxxxxxxWebRoot\cssscreen.add.css
3/10/2011 3:45:29 PM: StreamValue:Stream read error ItemsCount:11200 Memory:425464
StreamSize : 3743 i=11198 Name: \xxxxxxxxWebRoot\JSArtWeb.js
P.S.
arrayLock: TMultiReadExclusiveWriteSynchronizer;
fItems: Array Of rCache;
Type
rCache = Record
Name: String;
value: TStringStream;
expired: TDateTime;
End;
And calling function:
Function tCacheInMemory.CacheCheck(cName: String; Out BlobStream: TStringStream): Boolean;
Begin
Result := False;
If Not IfUseCache Then
exit;
BlobStream.SetSize(0);
BlobStream.Size := 0;
StreamValue(trim(cName), True, BlobStream);
If BlobStream.Size > 0 Then
Result := True;
End;
`
Wolf
9,4847 gold badges62 silver badges105 bronze badges
asked Mar 15, 2011 at 21:34
6
You’re not using correct locking. You’re acquiring a read lock on the array of cache entries, but once you find the item you want, you modify it. First, you explicitly modify it by assigning its Position property, and then you implicitly modify it by reading from it, which modifies its Position property again. When other code attempts to read from that same cache item, you’ll have interference. If the source stream’s Position property changes between the time the destination stream calculates how many bytes are available and the time it actually requests to read those bytes, you’ll get a stream-read error.
I have a couple pieces of advice related to this:
- Don’t use streams as a storage device in the first place. You’re apparently holding the contents of files. You’re not going to change those, so you don’t need a data structure designed for making sequential changes. Instead, just store the data in simple arrays of bytes:
TBytes. (Also, use ofTStringStreamin particular introduces confusion over whether those strings’ encodings are important. A simple file cache shouldn’t be concerned with string encodings at all. If you must use a stream, use a content-agnostic class likeTMemoryStream.) - Don’t quell an exception that you haven’t actually handled. In this code, you’re catching all exception types, logging some information, clearing the cache, and then proceeding as though everything is normal. But you haven’t done anything to resolve the problem that triggered the exception, so everything is not normal. Since you’re not really handling the exception, you need to make sure it propagates to the caller. Call
raiseafter to callClear. (And when you log the exception, make sure you log the exception’sClassNamevalue as well as its message.)
answered Mar 15, 2011 at 23:19
Rob KennedyRob Kennedy
161k21 gold badges276 silver badges463 bronze badges
2
It looks like something external is blocking your stream files.
You could try to use Process Monitor to see what blocks it.
Another thing you can try is to open the stream in read-deny-write mode (please show us how you open the stream).
Something like this:
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
Edit 1: Disregard the strike through part: you are using TStringStream.
I’ll keep the answer just in case anyone ever gets this kind of error when using TFileStream.
Edit 2: Yuriy posted this interesting addendum, but I’m not sure it will work, as the BlobStream is not initialized, just like Robert Love suspected:
Function TCacheInMemory.CacheCheck(cName: String; Out BlobStream: TStringStream): Boolean;
Begin
Result := False;
Try
If Not IfUseCache Then
exit;
BlobStream.SetSize(0);
BlobStream.Size := 0;
StreamValue(trim(cName), True, BlobStream);
If BlobStream.Size > 0 Then
Result := True;
Except
On E: Exception Do
Begin
x.xLogError('LogErrorCacheInMemory.txt', 'CheckCacheOutStream:' + E.Message + ' ItemsCount:' + IntToStr( High(fItems)) + 'Memory:' + IntToStr(x.GetMemoryInfoMemory));
End;
End;
End;
—jeroen
answered Mar 15, 2011 at 21:55
5

ВНИМАНИЕ!
|
|
|
Сообщение |
|
Профи
Группа: Пользователи
Репутация: |
Доброго дня ув. форумчане. Сталкнулся с такой проблемой — моя Delphi программа работает с файлом и при каждом своём запуске считывает информацию с него (формат .bmp). В рандомном порядке я получаю ошибку Stream read error, которая обычно возникает, когда какое-либо другое приложение так же пользуется этим файлом. Но я проверил и ни 1 из приложений не может использовать этот файл — так же просто перезагружал компьютер и первым делом запускал программу — тоже самое, хотя на автозапуске системы никаких лишних программ нету. Буду рад любым мыслям и идеям. ——————— Цитата Imagination is more important than knowledge. Albert Einstein |
|
|
|
| IUnknown |
Сообщение |
Гуру
Группа: Пользователи
Репутация: |
Цитата Но я проверил и ни 1 из приложений не может использовать этот файл — так же просто перезагружал компьютер и первым делом запускал программу — тоже самое, хотя на автозапуске системы никаких лишних программ нету. Значит, предположение о том, что что-то держит файл — неверное. Показывай код, выдающий ошибку, либо обращайся к телепатам за помощью. Без исходника ничего сказать невозможно. |
|
|
|
| Tan |
Сообщение |
Профи
Группа: Пользователи
Репутация: |
Cпасибо за ответ. Есть картинка 256 x 256, переменная TexFileName содержит название файла, что находится в корневой директории проекта. const ——————— Цитата Imagination is more important than knowledge. Albert Einstein |
|
|
|
| IUnknown |
Сообщение |
Гуру
Группа: Пользователи
Репутация: |
Картинка чем создавалась? Фотошопом? Попробуй ее пересохранить другим редактором, GIMP-ом, или ACDSee, к примеру. На RSDN как-то была тема, что сохраненные фотошопом битмапы не грузятся через LoadFromFile, а пересохраненные (их размер — на 2 байта меньше, чем у фотошопленных) — прекрасно грузятся. |
|
|
|
| Tan |
Сообщение |
Профи
Группа: Пользователи
Репутация: |
Да Photoshop. Тупо пересохранил через Paint, на мой взгляд проблема исчезла, никогда в жизни бы не подумал, что виноват редактор, ведь формат .bmp в теории не должен менять своей структуры в зависимости от редактора. Большое спасибо за помощь. Сообщение отредактировано: Tan — 26.11.2011 2:48 ——————— Цитата Imagination is more important than knowledge. Albert Einstein |
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
Связь с администрацией: bu_gen в домене octagram.name


Сообщение было отмечено salaev как решение
25.11.2011 19:34

10 




