Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
.NET 4.x

Постоянно растет объём памяти процесса

21.04.2024, 01:50. Показов 2700. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код ниже:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication344
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            //создаем PictureBox для отображения скриншотов
            var pb = new PictureBox { Parent = this, Dock = DockStyle.Fill, SizeMode = PictureBoxSizeMode.Zoom };
 
            //создаем поток для клиента (на самом деле это должно запускаться на машине клиента, но для теста, клиент запускается здесь)
            ThreadPool.QueueUserWorkItem(delegate { new Client().Start(); });
 
            //создаем поток для сервера
            ThreadPool.QueueUserWorkItem(
            delegate
            {
                //получаем в цикле скриншоты с клиента
                foreach (var bmp in new Server().GetScreenshots())
                {
                    //уничтожаем предыдущее изображение
                    if (pb.Image != null) pb.Image.Dispose();
                    //заносим скриншот в PictureBox
                    pb.Image = bmp;
                }
            });
        }
    }
 
    /// <summary>
    /// Сервер
    /// </summary>
    class Server
    {
        public IEnumerable<Image> GetScreenshots(int port = 24432)
        {
            var list = new TcpListener(port);
            list.Start();
 
            using (var tcp = list.AcceptTcpClient())//принимаем конект
            using (var stream = tcp.GetStream())//создаем сетевой поток
            using (var br = new BinaryReader(stream)) //создаем BinaryReader
            while (true)//делаем бесконечно
            {
                //принимаем длину массива
                var len = br.ReadInt32();
                //принимаем массив
                var arr = br.ReadBytes(len);
                using(var ms = new MemoryStream(arr))//создаем временный поток для сжатого изображения
                {
                    //создаем изображение
                    yield return Bitmap.FromStream(ms);
                }
            }
        }
    }
    
    /// <summary>
    /// Клиент
    /// </summary>
    class Client
    {
        public void Start(string host = "localhost", int port = 24432)
        {
            //размеры экрана
            var rect = Screen.PrimaryScreen.Bounds;
 
            //конкетимся к серверу, получаем поток
            using (var tcp = new TcpClient(host, port)) //создаем TcpClient
            using (var stream = tcp.GetStream()) //получаем сетевой поток
            using (var bw = new BinaryWriter(stream)) //создаем BinaryWriter
            using (var bmp = new Bitmap(rect.Width, rect.Height)) //создаем битмап для отправки
            using (var gr = Graphics.FromImage(bmp)) //создаем канву
            using (var ms = new MemoryStream()) //создаем временный поток для сжатого изображения
            while (true) //делаем бесконечно
            {
                //захватываем изображение экрана
                gr.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);
                //конвертируем изображение в массив байт в формате jpeg
                ms.Position = 0;
                bmp.Save(ms, ImageFormat.Jpeg);
                var arr = ms.ToArray(); //получаем массив байт
                //отправляем длину массива данных
                bw.Write(arr.Length);
                //отправляем массив
                bw.Write(arr);
                //точно, отправялем
                bw.Flush();
            }
        }
    }
}
Взят с этого форума при его запуске постоянно растёт объём памяти процесса, чего по идее быть не должно, ведь оно выполняет одинаковые действия в цикле.
Прошу помочь найти в чем причина и по возможности устранить...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2024, 01:50
Ответы с готовыми решениями:

Есть int i который постоянно растет
Здравствуйте, подскажите как узнать на сколько вырос i за 1 секунду? Спасибо.

растёт потребление памяти
есть программа, которая принимает сообщения по сети. с каждым принятым сообщением потребление оперативной памяти возрастает и в течении дня...

Объём памяти процесса
Подскажите каким образом можно диагностировать почему растет объём памяти процесса? Делаю снимки куч - сравниваю, разница отсутствует,...

25
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
22.04.2024, 12:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну, не знаю, не знаю...
А, ну я в дебаге в одном процессе запустил. 20 минут - полтора гига отъело. Видать, тестировать надо в реальных условиях.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
22.04.2024, 12:10
Цитата Сообщение от IamRain Посмотреть сообщение
Видать, тестировать надо в реальных условиях
Да, еще момент - оригинальный код не менял, но сделал на нет 7.0. Может из-за этого чего "оптимизировалось"...
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
22.04.2024, 12:36
Ну кстати если окошко не разворачивать/сворачивать, то тоже держится, если развернуть/свернуть - то подскакивает заметно. Runtime - NETFW4.8
Миниатюры
Постоянно растет объём памяти процесса  
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
22.04.2024, 12:50
Мне кажется, что сам подход не совсем верный (да и не корректный). Зачем такой объем практически "потокового видео"? Полезной информации между кадрами ну очень мало - что может измениться на экране за 50-100-200 кадров при таком цикле? Раз в секунду хотя бы слать...

Делал я такое недавно - с ноута надо было забирать "снимки" приложения (ну, можно сказать, всего экрана).
Скриншоты делались утилиткой NirCmd, складывались в папку, а сервер (основной ПК) забирал их от туда через равные промежутки времени. Никакой нагрузки на сеть + в полне себе информативность.
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
26.04.2024, 00:56  [ТС]
Нашел устраивающее решение, но столкнулся с другим вопросом. Создал отдельную тему: Некорректно работает остановка работы части программы
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.04.2024, 11:03
Лучший ответ Сообщение было отмечено YuS_2 как решение

Решение

Не по теме:

Как говорится "хороша ложка к обеду", но уже как есть...



koc94ok, обещанный пример:
1. Идея с тем чтобы прям из NetworkStream читать/писать в Bitmap не оправдалась. Внезапно там вызывается как Position, так и SetLength. В общем таки придется писать сначала в Memory, а после из неё.
2. Реюз Memory можно сделать вообще полный. Т.е. очищаем, выставляем позицию на +8 (длина long), пишем наш Bitmap, смотрим длину, возращаемся на ноль, пишем длину. Потом тупо CopyTo в NetworkStream
3. Тест подмены изображений показал что формы внезапно нормально обрабатывают 60 кадров в секунду и память никуда не уходит.
4. за десять минут ушло 2Гб мобильного интернета. Т.е. трафика такой подход генерит немеряно.

В прикрепленном файле два проекта: сервак и клиент. Сервак ожидает подключения и выводит на табу экран отдельного подключения. Т.е. может подключать сколько влезет, я тестил до 4. За 20 минут память что на клиентах, что на серваке не подымалась выше 50Мб. Там же сразу предусмотрел остановку/перподключение как клиентов, так и сервака.

P.S. на мониторах с масштабированием не 100% захват работает "криво" -- выводит только верхнюю левую часть экрана. Быстрый поиск ничего толкового не дал. Также учтите что это .net 4.7, там как-то странно фризится код при попытке отмены через CancelationToken. Проблема известная "фиксится" переходом на более новую версию.

P.P.S. Разрыв связи через потерю интернета не проверял, уже как-то сами.
Вложения
Тип файла: zip ScreenshotMonitoring.zip (544.8 Кб, 12 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2024, 11:03

Вычислить объём доступной памяти каждого процесса
Доброго времени суток форумчане! Будучи студентом на 4 курсе, столкнулся с такой лабораторной работой по курсу &quot;Параллельная...

Как увеличить или уменьшить объем памяти для конкретного процесса?
Добрый день, подскажите пожалуйста. Возможно ли увеличить или уменьшить объем оперативной памяти для конкретного процесса в Windows...

BAT\VBS скрипт который будет отслеживать меняется ли объем памяти и процесса
Добрый день! Суть задачи: - Постоянно работают процессы к примеру program.exe на сервере под определенным пользователем user1. ...

Время загрузки компа постоянно растет
Здравствуйте. Пару месяцев назад обновил комп - установил 10 Win (вместо семерки) на новый ssd диск (раньше стоял обычный винт). Все было...

Количество Ajax запросов постоянно растет. Нужно исправить!
$(document).ready(function() { function funcBefore() { $(&quot;#information&quot;).text('Загрузка данных'); } function...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru