.net растровый вопрос - PullRequest
       9

.net растровый вопрос

0 голосов
/ 05 июля 2010

У меня была ошибка в моей программе, поэтому я провел несколько экспериментов и обнаружил, что следующий код заканчивается

выдает исключение после некоторого запуска.

while ( 1 )
{
    System::Drawing::Bitmap^ pBitmap = gcnew System::Drawing::Bitmap( 500, 500 );
    this->Cursor = gcnew System::Windows::Forms::Cursor(pBitmap->GetHicon());
}

Я могу 'Я не могу найти ключ к этому исключению.

Что не так?

Поэтому я изменяю код на этот

while ( 1 )
{
    System::Drawing::Bitmap^ pBitmap = gcnew System::Drawing::Bitmap(500,500);                                
    System::Windows::Forms::Cursor^ pCursor = gcnew System::Windows::Forms::Cursor(pBitmap->GetHicon());                                                               

    delete pBitmap;
    delete pCursor;                
}

По-прежнему выдается то же исключение.

Любая подсказка будет благодарна.

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

При создании растровых изображений вы запрашиваете память (500 * 500 * bytesPerPixeL) и внутренние дескрипторы GDI.Количество доступных ручек довольно большое, но ограниченное.Итак, я предполагаю, что вы либо исчерпаете память до того, как начнет работать сборщик мусора, либо у вас не хватит дескрипторов GDI.

Вы должны использовать использование (pBitmap = ...) для вызова Dispose () автоматически или вызовите Dispose () вручную, когда вы закончите.То же самое касается и курсора.

В статье MSDN Объекты GDI говорится:

"Существует теоретический предел в 65 536 дескрипторов GDI на сеанс. Однако максимальное количествоДескрипторы GDI, которые могут быть открыты за сеанс, обычно ниже, поскольку на них влияет доступная память. "

0 голосов
/ 05 июля 2010

Я воссоздал проблему, и это выглядит так: Снимок экрана

Когда я смотрел на диспетчер задач, мое потребление памяти при запуске программы для первых 5000 прогонов выгляделокак я и ожидал.График увеличивался при выделении памяти для новых изображений и уменьшался, когда GC высвобождает память. Однако освобождение памяти никогда не казалось идеальным, поскольку значение, которое она уменьшала во время уменьшений, продолжало расти.Это заставляет меня верить, что у вас какая-то утечка памяти.

- и поэтому мои навыки Шерлока Холмса потерпели неудачу, и мои навыки Коломбо взяли верх.Что может быть причиной такой утечки?Хм .. забыл позвонить .Dispose ()?Да, Bitmap действительно реализует IDisposable, оооочень не забывайте вызывать .Dispose () на вашем растровом изображении, прежде чем создавать новое:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...