This project has moved. For the latest updates, please go here.

Нехватка памяти

Apr 16, 2014 at 7:13 AM
Привет, надеюсь здесь можно писать по русски.
Во первых спасибо за библиотеку, пол года назад она меня просто спасла.

Но есть проблема, В процессе работы возникает ошибка нехватки памяти.
Допустим при загрузке около 15 листов с автоподатчика, ошибка возникает почти всегда, но это понятно памяти действительно может не хватать, хотелось бы от этого тоже избавится(получая в программу изображения постранично), но это не главное.
Главное что, память возможно полностью не освобождается после предыдущего сканирования. Например, сканирование 10 страниц проходит, гладко, но при сканировании следующих 10 страниц, возникает ошибка нехватки памяти. Хотя объект twain32 я создаю новый для следующего сканирования и завершаю работу через _twain32.Dispose();

В какую сторону копать? Есть ли возможность избавится или обойти проблему нехватки памяти. На всякий случай приведу стек ошибки:
System.OutOfMemoryException: Ќедостаточно пам¤ти.
в System.Drawing.Graphics.CheckErrorStatus(Int32 status)
в System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y, Int32 width, Int32 height)
в System.Drawing.Bitmap..ctor(Image original, Int32 width, Int32 height)
в System.Drawing.Bitmap..ctor(Image original)
в Saraff.Twain.DibToImage.WithScan0(IntPtr dibPtr)
в Saraff.Twain.Twain32._TransferPictures()
в Saraff.Twain.Twain32._MessageFilter.PreFilterMessage(Message& m)
в System.Windows.Forms.Application.ThreadContext.ProcessFilters(MSG& msg, Boolean& modified)
в System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
в System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в Saraff.Twain.Twain32.Acquire()
в earchive.ScanWorks.RunTwain()
в earchive.ScanWorks.GetImages()
в earchive.InputDocs.OnScanActionActivated(Object sender, EventArgs e)

Может быть такое поведение связано с тем, что я работаю без родительского окна. Подробнее расскажу в отдельной теме.
Coordinator
Apr 16, 2014 at 4:31 PM
Добрый день.
Для того, чтобы освободить память которую использует изображение необходимо вызывать метод Dispose для каждого изображения которое было отсканировано. Но это нужно делать только после того как изображение больше не используется. Можно также обрабатывать событие EndXfre. Вместе с ним приходит экземпляр текущего (отсканированного) изображения. Его можно обработать и если оно больше не будет использоваться, то можно сразу же вызвать метод Dispose, но надо быть внимательным, т.к. класс Image является ссылочным, то при обработке изображения используется ссылка на него.
Тем не менее, в скором времени я опубликую версию библиотеки в которой будут реализованы режимы передачи через память (фрагментами) и через файл. Это полностью решит проблему нехватки памяти.
Marked as answer by Gankov on 4/17/2014 at 12:11 AM