Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 01.11.2013
Сообщений: 28
.NET 4.x

Огромный расход памяти

01.11.2013, 23:11. Показов 1043. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код ( каждые 10 секунд делает скрины и сохраняет их)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
using System.IO;
namespace Screenshots
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        /// 
 
        static void MakeScreenShot()
        {
            Graphics graph ;
 
            var bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
 
            graph = Graphics.FromImage(bmp);
 
            graph.CopyFromScreen(0, 0, 0, 0, bmp.Size);
 
            string Filename =  SystemInformation.UserName + "_" + DateTime.Today.Date.DayOfWeek + "_" + DateTime.Now.Hour + "_" + DateTime.Now.Minute + Guid.NewGuid() + ".png";
            bmp.Save(Filename);
            Thread.Sleep(1000);
            File.Delete(Filename);
        }
 
        [STAThread]
        static void Main()
        {
            while (true)
            {
                Thread.Sleep(1000 * 10);
                MakeScreenShot();
                
            }
        }
    }
}
Проблема в том, что расходуется огромное количество памяти. С каждым новым скриншотом, программа требует памяти ~ на 10 мб больше и через несколько минут она занимает уже около 500 мб.
Что можно сделать чтобы избежать этого?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2013, 23:11
Ответы с готовыми решениями:

Варианты наследования. Расход памяти
Всем доброго времени суток. Возник такой вопрос (исключительно в целях повышения самообразованности), каков расход памяти при...

Огромный EXE Файл , Нужна помошь
И так , ситуация такая , есть программа , которая берет файл(любой) и записывает его в конце другой программы(отныне шаблон) , которая...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка ссылки с сайта и ищет там определенную...

10
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.11.2013, 23:33
Создать Bitmap один раз, и переписывать информацию в него. Вместо создания каждый раз нового.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    static class Program
    {
        static Bitmap bmp;
 
        static void MakeScreenShot()
        {
            Graphics graph = Graphics.FromImage(bmp);
            graph.CopyFromScreen(0, 0, 0, 0, bmp.Size);
 
            string Filename = @"D:\screen.png";
            bmp.Save(Filename);
            Thread.Sleep(1000);
        }
 
        [STAThread]
        static void Main()
        {
            bmp = new Bitmap(1366, 768);
 
            while (true)
            {
                Thread.Sleep(1000 * 10);
                MakeScreenShot();
            }
        }
    }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
02.11.2013, 00:32
Такая... Улучшенная версия
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
 
namespace ConsApp_Screenshot
{
    static class Program
    {
        private static readonly Bitmap Bmp;
        private static readonly Graphics Graph;
        private static readonly string RootDirectory;
 
        const int Delay = 1000 * 10;
 
        static Program() //статический конструктор, чтобы можно было проинициализировать readonly переменные (по сути константы)
        {
                Bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graph = Graphics.FromImage(Bmp);
                RootDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\";
        }
 
        [STAThread]
        static void Main()
        {
            while (true)
            {
                Thread.Sleep(Delay);
                WriteColored(ConsoleColor.Yellow, "Скриншот сохранён. {0} - {1}:", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString());
                WriteColoredLine(ConsoleColor.White, "{0}", MakeScreenShot());
            }
        }
 
        static string MakeScreenShot()
        {
            Graph.CopyFromScreen(0, 0, 0, 0, Bmp.Size);
            Console.WriteLine();
            DateTime now = DateTime.Now;
            string fileName = string.Format("{0}_{1}_{2}_{3}_{4}_{5}.png",
                RootDirectory, SystemInformation.UserName, DateTime.Today.Date.DayOfWeek,
                now.Hour, now.Minute, Guid.NewGuid());
            Bmp.Save(fileName);
            return fileName;
        }
 
        static void WriteColored(ConsoleColor color, string text, params object[] args)
        {
            ConsoleColor previousColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            Console.Write(text, args);
            Console.ForegroundColor = previousColor;
        }
 
        static void WriteColoredLine(ConsoleColor color, string text, params object[] args)
        {
            ConsoleColor previousColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            Console.WriteLine(text, args);
            Console.ForegroundColor = previousColor;
        }
    }
}
Вложения
Тип файла: zip ConsApp_Screenshot.zip (30.4 Кб, 3 просмотров)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
02.11.2013, 00:42
Не увидел метод Console.WriteLine() внутри метода MakeScreenShot, по идее нужно убрать, ибо бред, там оно совершенно не в тему, и это в корне не правильно.

Добавлено через 2 минуты
По идее и сохранять, равно как и генерить имя в методе MakeScreenShot тоже не правильно. Если писать сразу гибко, то можно и генераторы имён разные подставлять минимально меняя код, так же и сохранять далеко не всегда нужно на жёсткий диск, да и в другом потоке можно это делать.

Добавлено через 19 секунд
В общем, для такой мелкой задачи лишние заморочи.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
03.11.2013, 12:12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using (var bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
            {
                using (Graphics graph = Graphics.FromImage(bmp))
                {
 
                    graph.CopyFromScreen(0, 0, 0, 0, bmp.Size);
 
                    string Filename = SystemInformation.UserName + "_" + DateTime.Today.Date.DayOfWeek + "_" +
                                      DateTime.Now.Hour + "_" + DateTime.Now.Minute + Guid.NewGuid() + ".png";
                    bmp.Save(Filename);
                    Thread.Sleep(1000);
                    File.Delete(Filename);
                }
            }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2013, 12:34
Цитата Сообщение от Grishaco Посмотреть сообщение
C#
1
Thread.Sleep(1000);
А это зачем?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
03.11.2013, 12:41
kolorotur, код указан в начале топика, я обернул только в using
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2013, 12:46
Цитата Сообщение от Grishaco Посмотреть сообщение
код указан в начале топика, я обернул только в using
А, точно. Пардон!

the_genius,
Цитата Сообщение от the_genius Посмотреть сообщение
Thread.Sleep(1000);
А это зачем?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2013, 20:15
kolorotur, ну как же! Традиционный способ избежать гонки потоков. С вами на рынке с 50гг.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.11.2013, 20:31
Psilon, дык потоков же никаких не создается, а слип — вот он

Ну а слип в качестве синхронизации — это да, классика!
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
03.11.2013, 20:43
C#
1
2
3
            bmp.Save(Filename);
            Thread.Sleep(1000);
            File.Delete(Filename);
Ну здесь слип между сохранением файла и удалением, видимо что бы за секунду можно было глянуть скрин.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2013, 20:43
Помогаю со студенческими работами здесь

расход памяти в С#
Мне хотелось бы знать сколько моя программа занимает памяти я использую GC.GetTotalMemory(true) однако мне хотелось бы знать сколько ...

Расход памяти для числа Фибоначчи
Доброго времени суток! Подскажите пожалуйста такой нюанс: При реализации поиска n-числа Фибоначчи рекурсивным методом затраты по...

Огромный размер программ
Всем привет!У меня вопрос: Как ни напишу прогу, скомпилирую, запущу...так они все ресурсов жрут оч много, а функциональности почти ноль.В...

Как занести огромный текст в массив?
Допустим у меня есть огромный текст из over 100500 слов разделенных переносом на другую строку. Как мне занести все эти строки в массив...

Большой расход памяти
Пишу приложение, которое берёт слово из файла и отправляет его через форму на сайт. И всё работает как надо, вот только потребляемая память...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru