4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
1

Увеличение используемой оперативной памяти

04.08.2010, 15:32. Показов 4729. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
На C# была написана простая однокнопочная диалоговая форма.
При использовании программа постоянно увеличивает объём используемой оперативной памяти, медленно но верно. Дело явно где-то в цикле, там больше ничего и нету )) вот только где, мб кто подскажет?

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
        private void button3_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process[] ProcessList;
            while (true)
            {
                Thread.Sleep(5000);
                ProcessList = Process.GetProcesses();
                bool l2serverflag = false;
                bool l2npcflag = false;
                foreach (System.Diagnostics.Process pr in ProcessList)
                {
                    if (pr.ProcessName == "l2server")
                    {
                       
                        l2serverflag = true;
                        foreach (System.Diagnostics.Process pr2 in ProcessList)
                        {
                            if (pr2.ProcessName == "l2npc")
                            {
                                l2npcflag = true;
                                
                                
                            }
                        }
                        ProcessList = null;
                        
                    }
 
                }
 
                if ((l2serverflag == true)&&(l2npcflag == false))
                {
                    Process.Start(ABC.filenameL2npc);
                }
 
                if ((l2serverflag == false) && (l2npcflag == false))
                {
                    Process.Start(ABC.filenameL2server);
                    Thread.Sleep(60000);
                    Process.Start(ABC.filenameL2npc);
                }
 
                if ((l2serverflag == false) && (l2npcflag == true))
                {
                    foreach (Process proc in Process.GetProcessesByName("l2npc"))
                    {
                        proc.Kill();
                    }
                    Thread.Sleep(5000);
                    Process.Start(ABC.filenameL2server);
                    Thread.Sleep(60000);
                    Process.Start(ABC.filenameL2npc);
                }
                
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2010, 15:32
Ответы с готовыми решениями:

Кто определяет максимальный размер используемой процессом памяти?
Доброго времени суток. Вопрос знатокам платформы .Net. Есть у процесса свойство...

Загрузка оперативной памяти
Пишу проект на C# связанный с базами данных. Необходимо мониторить то как сильно приложение грузит...

Использование оперативной памяти
Создаю программу подсчета суммы элементов массива. Надо подсчитать врема затраченное и количество...

Загрузка ЦП и оперативной памяти
Добрый день. Я начал делать программу. Которая показывает загрузку ЦП и оперативной памяти. Windows...

14
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
04.08.2010, 15:40 2
Я у вас выхода из цикла не увидел - следовательно цикл бесконечный. Вот и расход памяти.
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
04.08.2010, 15:58  [ТС] 3
в этом и задумка, программа должна постоянно висеть в памяти и контролировать наличие запущенных других двух процессов.
Почему при каждом проходе цикла количество используемой оперативной памяти увеличивается?
Возможно ли как то освобождать в конце цикла использованную ненужную больше память?

Добавлено через 11 минут
Может быть то, что я хочу сделать реализуется как-то по другому, более правильно?
0
2096 / 1261 / 171
Регистрация: 01.02.2009
Сообщений: 2,842
04.08.2010, 16:05 4
Освобождением памяти занимается сборщик мусора. Вообще-то он автоматом может освободить ресурсы, занятые каким-либо процессом. Но можно его вызывать и самому. Почитайте про класс GC.
Но, имхо, думаю, что у вас не оптимально работает код.
1
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
04.08.2010, 16:32 5
будь проще
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
        private void L2CheckLoop() {
            System.Diagnostics.Process[] ProcessList;
 
            for (; ; Thread.Sleep(10000)) {
 
                Process[] servers = Process.GetProcessesByName("l2server");
                Process[] npcs = Process.GetProcessesByName("l2npc");
 
                // уничтожить все лишние серваки
                if (servers.Length > 1) {
                    for (int i = 1; i < servers.Length; i++)
                        servers[i].Kill();
                    Thread.Sleep(10000);
                }
 
                // уничтожить все лишние серваки нюпсов
                if (npcs.Length > 1) {
                    for (int i = 1; i < npcs.Length; i++)
                        npcs[i].Kill();
                    Thread.Sleep(5000);
                }
 
                // если собсна и не было сервака
                if (servers.Length == 0) {
                    Process.Start(ABC.filenameL2server);
                    Thread.Sleep(60000);
                }
 
                // если собсна и не было сервака нюпсов
                if (npcs.Length == 0) {
                    Process.Start(ABC.filenameL2npc);
                    Thread.Sleep(5000);
                }
 
            }
Добавлено через 51 секунду
Цитата Сообщение от kirill29 Посмотреть сообщение
Но, имхо, думаю, что у вас не оптимально работает код
совсем не оптимально... вообще говоря, он вообще не работает)

Добавлено через 4 минуты
можно в конец цикла пихнуть
C#
1
2
3
4
                for (int i = 1; i < servers.Length; i++)
                    servers[i].Dispose();
                for (int i = 1; i < npcs.Length; i++)
                    npcs[i].Dispose();
для красоты

Добавлено через 1 минуту
и НЕ надо это делать в потоке GUI !
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
04.08.2010, 16:50  [ТС] 6
Вставил GC.Collect() в конец цикла, и правда перестал расти расход оперативки =) за этот совет отдельное спасибо
Потом увидел вариант Mikant, мне понравилось Просто раз уж мы вдаёмся в подробности... Мне надо сделать так, чтобы если упал серв, но не упал нпц, то уронить нпц, поднять серв а следом уже поднимать серв. Для того и вводил флаги. Возможно как-то сделать это по другому?


Цитата Сообщение от Mikant Посмотреть сообщение
и НЕ надо это делать в потоке GUI !
я нупс ) имеется ввиду, что это действие от нажатия кнопки? А как тогда делать? Вызывать по кнопке функцию, которая описана в program.cs?

Добавлено через 8 минут
Ага туплю =)
вот так же будет работать?

C#
1
2
3
4
5
6
7
8
if ((servers.Length == 0)&&(npcs.Lenght == 1)) 
{
                    //тут надо убить процесс нпц, как? не разобрался ))
                    Process.Start(ABC.filenameL2server);
                    Thread.Sleep(60000);
                    Process.Start(ABC.filenameL2npc);
                    
}
0
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
04.08.2010, 17:13 7
ну подправь
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
        private void L2CheckLoop() {
            System.Diagnostics.Process[] ProcessList;
 
            for (; ; Thread.Sleep(10000)) {
 
                Process[] servers = Process.GetProcessesByName("l2server");
                Process[] npcs = Process.GetProcessesByName("l2npc");
 
                // уничтожить все лишние серваки
                if (servers.Length > 1) {
                    for (int i = 1; i < servers.Length; i++)
                        servers[i].Kill();
                    Thread.Sleep(10000);
                }
 
                // уничтожить все лишние серваки нюпсов
                if (npcs.Length > 1) {
                    for (int i = 1; i < npcs.Length; i++)
                        npcs[i].Kill();
                    Thread.Sleep(5000);
                }
 
                bool npcKilled = false;
                // если собсна и не было сервака
                if (servers.Length == 0) {
                    if (npcKilled = npcs.Length > 0)
                        for (int i = 1; i < npcs.Length; i++)
                            npcs[i].Kill();
                    Process.Start(ABC.filenameL2server);
                    Thread.Sleep(60000);
                }
 
                // если собсна и не было сервака нюпсов
                if (npcs.Length == 0 || npcKilled) {
                    Process.Start(ABC.filenameL2npc);
                    Thread.Sleep(5000);
                }
 
            }
        }
никогда не используй GC.Collect вручную!!!!!!!!!!!!!!!!!
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
04.08.2010, 17:23  [ТС] 8
Цитата Сообщение от Mikant Посмотреть сообщение
никогда не используй GC.Collect вручную!!!!!!!!!!!!!!!!!
А почему? чем грозит? Как правильно использовать?
p.s. да, я доставучий
0
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
04.08.2010, 17:30 9
английский знаешь?
http://blogs.msdn.com/b/ricom/... 71829.aspx
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
04.08.2010, 18:29  [ТС] 10
знаю но туго =)
можно в двух словах, почему нельзя и как нужно?
0
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
04.08.2010, 18:35 11
а ты просто мой код пытался выполнить? ну что, увеличивается "оперативная память"?
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
05.08.2010, 08:50  [ТС] 12
Ага. всё равно растёт потребление, примерно по 500кб за проход цикла. Это очень много.
и да, этот код я в конец цикла вставил, не забыл

Цитата Сообщение от Mikant Посмотреть сообщение


C#
1
2
3
4
for (int i = 1; i < servers.Length; i++)
 servers[i].Dispose();
 for (int i = 1; i < npcs.Length; i++)
 npcs[i].Dispose();

Что значила фраза, что не надо этого делать в гуи? Я попробовал вынести эту функцию отдельно в файле Form1.cs и потом вызвать её по нажатию кнопки, эффект был тот же - окно программы виснет, хоть она и продолжает выполняться. Мб надо было вставить функцию в program.cs и сделать её public?
0
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
05.08.2010, 10:18 13
вот еще одно решение
(вроде память не прибавляется)
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
while (true)
{
    Thread.Sleep(5000);
    System.Diagnostics.Process[] processList = Process.GetProcesses();
    bool l2Serverflag = false;
    bool l2Npcflag = false;
    foreach (System.Diagnostics.Process pr in processList)
    {
        if (pr.ProcessName == "l2server")
        {
            l2Serverflag = true;
        }
 
        if (pr.ProcessName == "l2npc")
        {
            l2Npcflag = true;
        }
    }
 
    if (l2Serverflag && !l2Npcflag)
    {
        Process.Start(ABC.FilenameL2Npc);
    }
 
    if (!l2Serverflag && !l2Npcflag)
    {
        Process.Start(ABC.FilenameL2Server);
        Thread.Sleep(60000);
        Process.Start(ABC.FilenameL2Npc);
    }
 
    if (!l2Serverflag && l2Npcflag)
    {
        foreach (Process proc in Process.GetProcessesByName("l2npc"))
        {
            proc.Kill();
        }
        Thread.Sleep(5000);
        Process.Start(ABC.FilenameL2Server);
        Thread.Sleep(60000);
        Process.Start(ABC.FilenameL2Npc);
    }
}
1
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
05.08.2010, 17:23 14
Цитата Сообщение от fannylife Посмотреть сообщение
500кб за проход цикла
- false!

какая ж разница, в каком она файле живет?? просто в отдельный поток всё это уноси
1
4 / 4 / 0
Регистрация: 04.08.2010
Сообщений: 20
07.08.2010, 19:47  [ТС] 15
Всё получилось, спасибо
0
07.08.2010, 19:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2010, 19:47
Помогаю со студенческими работами здесь

Высвобождение кешированной оперативной памяти
Всем привет. Можно ли как то высвободить кешированную оперативную память системы средствами С# ?

Очистка оперативной памяти в Windows 7
Добрый день) Как можно очистить ( дефрагментировать ) оперативную память (RAM) в Windows 7? С...

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

Считывание конкретной ячейки из оперативной памяти
Доброго времени суток, форумчане! Задача состоит в том, чтобы считать ячейку из оперативной памяти...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru