| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Загрузка файла в Stream через Thread |
| Автор: ZeroDivide 12.8.2005, 18:37 | ||
Я написал модуль, загружающий файл в TMemoryStream (надо для игрового движка).
Файл загружаю функцией LoadStream. На маленьких файлах работает отлично, но с большими (вроде более 800 килобайт) возникает исключение: "Stream read error. Out of memory while expanding memory stream". Перепробовал кучу способов (Read/Write, через файлы, через хендлы), ничего не изменилось. Как исправить? Заранее спасибо за ответы. |
| Автор: _hunter 12.8.2005, 18:50 |
| перед FStream.CopyFrom нужно позицию Loader-а в 0 поставить... |
| Автор: Guest 12.8.2005, 19:29 |
| Это я просто криво код скопировал Изменений нет. Всё тот же "Stream read error. Out of memory while expanding memory stream". Памяти у меня 1024 МБ + файл подкачки. |
| Автор: p0s0l 12.8.2005, 21:30 |
| По всей видимости, памяти у тебя маловато... Может забываешь где-нибудь освобождать память ?... У себя сейчас проверил - ошибка вылазит, если кончается вся виртуальная память (у меня 512RAM + 1GB Swap)... Также даже если у тебя виртуальная память больше 2ГБ - проку мало, т.к. в NT-системах для пользовательских процессов доступна только половина адресного пространства, т.е. 2 Гб... (про Win9x - не знаю...) |
| Автор: Guest 13.8.2005, 09:39 |
| У меня Windows XP. Быть того не может, чтобы памяти не хватило... А другого способа нет? |
| Автор: Illusion Dolphin 13.8.2005, 10:01 | ||
p0s0l, к чему размер памяти? Ты ж посмотри, что там в коде написано
Для начала прочитай про многопоточность, может вопрос у тебя решится сам собой. Но если вопрос очень нужен, то тебе придётся сделать всё хотя бы по такому сценарию: 1) Создаём поток Thread := TZDLoader.Create(true); 2) присваиваем свойства 3) запускаем поток Thread.Resume; (Thread.free вызывать не нужно!) 4) из потока при завершении операции чтения вызываем функцию основного приложения для того чтобы передать указатель на поток с прочитанными данными (используй Synchronize) |
| Автор: p0s0l 13.8.2005, 11:16 |
| Мдя... Тестил я на простом TMemoryStream.SetSize... На LoadStream не посмотрел |
| Автор: Guest 13.8.2005, 19:10 |
| А по-моему ничего смешного Я впервые работаю с TThread`ами. А вот про Synchronize я почти ничего не понимаю, я знаю, что его используют для синхронизации данных между двумя потоками. Можете обеспечить ламера |
| Автор: p0s0l 13.8.2005, 19:36 |
| ZeroDivide, почитай о потоках в в этой статье, всё расжевано. http://forum.vingrad.ru/index.php?showtopic=60076&view=all Потратишь время на чтение, но сэкономишь его на отлове багов... PS: Можно уже и зарегистрироваться |
| Автор: ZeroDivide 13.8.2005, 20:20 |
| p0s0l, я уже скачал, буду читать. Ты не думай, что я ламер И всё таки ты можешь переписать мой модуль? Ведь про потоки читать-то много... |
| Автор: p0s0l 13.8.2005, 21:21 | ||
ZeroDivide, сделай так как написал Illusion Dolphin:
|
| Автор: Illusion Dolphin 13.8.2005, 21:40 | ||||
Я бы сделал так:
P.S. запоздал ))) уже запостили почти тот же вариант |
| Автор: ZeroDivide 14.8.2005, 08:12 |
| Я зарегистрировался Спасибо все отвечавшим! |