Скриншот : что за ошибка?

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Скриншот : что за ошибка?

Сообщение Al Prad » 26.11.2009 (Чт) 14:37

Добрый день!

В таймере периодически выполняется такой кусок:
Код: Выделить всё
Application.DoEvents();

                var totalSize = Rectangle.Empty;
                foreach (var s in System.Windows.Forms.Screen.AllScreens)
                    totalSize = Rectangle.Union(totalSize, s.Bounds);
                var screenShotBmp = new Bitmap(LS020_Width, LS020_Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb565);  //Format32bppArgb   
                var screenShotGraphics = Graphics.FromImage(screenShotBmp);
                screenShotGraphics.CopyFromScreen(ShotCenter.X - 88, ShotCenter.Y - 66, 0, 0, totalSize.Size, CopyPixelOperation.SourceCopy);
                screenShotGraphics.Dispose();

             

               pictureBox1.Image = screenShotBmp;



Периодически возникает такая ошибка:
BufferedGraphicsContext cannot be disposed of because a buffer operation is currently in progress
с указанием на строку Application.Run(new Form1());

Как это можно поправить?

Спасибо.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Скриншот : что за ошибка?

Сообщение Денис » 26.11.2009 (Чт) 14:53

Я в шарпе не силён, но рискну предположить, что вызывать screenShotGraphics.Dispose следовало бы после того, как закончится предыдущая операция. и если б я был на вашем месте, то перво-наперво я бы поискал у screenShotGraphics какие либо методы, возвращающие его состояние, чтобы так сказать, отмониторить, завершил ли он операцию или еще занят.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Скриншот : что за ошибка?

Сообщение Nord777 » 26.11.2009 (Чт) 15:42

Если код выполняется в Form_Load - повесь его временно на кнопку и посмотри.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: Скриншот : что за ошибка?

Сообщение Al Prad » 26.11.2009 (Чт) 16:02

Денис писал(а):Я в шарпе не силён, но рискну предположить, что вызывать screenShotGraphics.Dispose следовало бы после того, как закончится предыдущая операция. и если б я был на вашем месте, то перво-наперво я бы поискал у screenShotGraphics какие либо методы, возвращающие его состояние, чтобы так сказать, отмониторить, завершил ли он операцию или еще занят.


Из методов ничего путного не смог найти...

Nord777 писал(а):Если код выполняется в Form_Load - повесь его временно на кнопку и посмотри.


Код выполняется в таймере каждые 50 мсек. Ошибка возникает через несколько минут после запуска программы.
Еще заметил в windows task manager, что постоянно увеличивается объем памяти, используемый программой.

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Скриншот : что за ошибка?

Сообщение Alec » 26.11.2009 (Чт) 19:46

Смоделировал ситуацию в VB.Net, до ошибки не стал ждать - факт увеличения объема памяти налицо.
Помогло
Код: Выделить всё
screenShotBmp.Dispose()
что, в принципе, логично.
Иногда лучше вовремя остановиться...
И начать заново!

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: Скриншот : что за ошибка?

Сообщение Al Prad » 27.11.2009 (Пт) 10:54

У меня VS2008

Вставил в конце screenShotBmp.Dispose();

Получаю сразу же ошибку Parameter is not valid.

Поставил размеры снимка 1000х700 (вместо прежних 170х130). Раньше обем используемой памяти увеличивался понемногу, однако сейчас явно видно, что исп. память не увеличивается непрерывно, а периодически высвобождается ( даже если убрать screenShotGraphics.Dispose(); ).

Поставил счетчик количества раз срабатывания таймера. Получается, что таймер срабатывает определенное количество раз ( 9940 ), после чего и происходит сбой.

Al Prad
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 16.08.2007 (Чт) 12:46
Откуда: Одесса

Re: Скриншот : что за ошибка?

Сообщение Al Prad » 30.11.2009 (Пн) 9:11

Похоже, это ошибка в Framework

Вот кому интересно
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/84bb2ede-b6b1-4695-aa91-6b6f64285880


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList