Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Framework4.0 утечка памяти в потоках / 15 сообщений из 15, страница 1 из 1
07.07.2017, 10:36
    #39484290
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
привет. столкнулся с проблемой утечки памяти, ни как не могу отследить, не равнодушных прошу откликнутся)
Код: 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.
 private void Form1_Load(object sender, EventArgs e)
{      
            potok1 = new Thread(LabelTime);  
            potok1.IsBackground = false;
            potok1.Priority = ThreadPriority.Lowest; 
            potok1.Start();   

// в potok1 обновление таблиц, графиков и лэйблов
//всё это дело работает 24/7
// раз в сутки машину перезагружаем из-за скушанной памяти
}

 void LabelTime()
        {
            try
            {
                
                    while (true)
                    {
                        BeginInvoke(DelTimePOTOK,  dataGridView, dataGridView, dataGridView, dataGridView, dataGridView,
             label, label, label, label, label, label, chart,  chart);//имена изменил  
                        Thread.Sleep(1000);
                    }
                
            }
            catch { }
        }
//ну и сами процедуры
void StartTime()
{
  using (da = new NpgsqlDataAdapter("запрос"))
                            {
                                using (dt = new DataTable())
                                {
                                    da.Fill(dt);                                  
                                    if (dt.Rows.Count >= 0 && dataGridView.RowCount != dt.Rows.Count)
                                    {
                                        dataGridView.Invoke((Action)(() => dataGridView.DataSource = dt));
                                     }
                                }
                            }
//таких запросов около 10 + 2графика(там только чищу точки и заново добавляю их в цикле...)

}
...
Рейтинг: 0 / 0
07.07.2017, 12:15
    #39484408
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888привет. столкнулся с проблемой утечки памяти, ни как не могу отследить, не равнодушных прошу откликнутся)
Код: 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.
 private void Form1_Load(object sender, EventArgs e)
{      
            potok1 = new Thread(LabelTime);  
            potok1.IsBackground = false;
            potok1.Priority = ThreadPriority.Lowest; 
            potok1.Start();   

// в potok1 обновление таблиц, графиков и лэйблов
//всё это дело работает 24/7
// раз в сутки машину перезагружаем из-за скушанной памяти
}

 void LabelTime()
        {
            try
            {
                
                    while (true)
                    {
                        BeginInvoke(DelTimePOTOK,  dataGridView, dataGridView, dataGridView, dataGridView, dataGridView,
             label, label, label, label, label, label, chart,  chart);//имена изменил  
                        Thread.Sleep(1000);
                    }
                
            }
            catch { }
        }
//ну и сами процедуры
void StartTime()
{
  using (da = new NpgsqlDataAdapter("запрос"))
                            {
                                using (dt = new DataTable())
                                {
                                    da.Fill(dt);                                  
                                    if (dt.Rows.Count >= 0 && dataGridView.RowCount != dt.Rows.Count)
                                    {
                                        dataGridView.Invoke((Action)(() => dataGridView.DataSource = dt));
                                     }
                                }
                            }
//таких запросов около 10 + 2графика(там только чищу точки и заново добавляю их в цикле...)

}

понять, где у вас утечки из данного куска кода не представляется возможным.
если у вас VS Pro и выше, то там есть memory profiler'ы, с помощью которых можно делать снапшоты и сравнивать.
проверяйте циклические ссылки и всё борохло, что у вас создается в левых потоках
если где то используйте сериализацию, то там тоже могут быть утечки
...
Рейтинг: 0 / 0
07.07.2017, 12:16
    #39484409
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
fix: XML сериализацию
...
Рейтинг: 0 / 0
07.07.2017, 12:23
    #39484415
Addx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888,
И что из этого потока сознания понять можно?
Ваш код не будет работать в принципе, и мне непонятно, каким образом Вы привели реальный код к такому состоянию.
По сути Вы убрали все существенное и оставили какую-то ерунду.
По тому, что есть.
Вы можете гарантировать, что Form1_Load срабатывает один раз?
Что поток когда-либо завершается?
И вообще какая-то очень странная программа.
...
Рейтинг: 0 / 0
07.07.2017, 13:50
    #39484526
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Roman Mejtes, сериализацию не использую. профайлер есть, но я пока не особо с ним подружился(единственное что в нем видно - это тип string постоянно растущий).
...
Рейтинг: 0 / 0
07.07.2017, 13:53
    #39484529
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Addxwild888,
И что из этого потока сознания понять можно?
Ваш код не будет работать в принципе, и мне непонятно, каким образом Вы привели реальный код к такому состоянию.
По сути Вы убрали все существенное и оставили какую-то ерунду.
По тому, что есть.
Вы можете гарантировать, что Form1_Load срабатывает один раз?
Что поток когда-либо завершается?
И вообще какая-то очень странная программа.

"Вы можете гарантировать, что Form1_Load срабатывает один раз?" -ДА
"Что поток когда-либо завершается?"-точно не могу сказать но глядя в диспетчер задач, потоки не растут.
...
Рейтинг: 0 / 0
07.07.2017, 13:57
    #39484534
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Код: 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.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
 try
            {
                if (status == true)//и если функция успела выполнится вызываем её заново
                {
                    status = false;
                    using (p = new Ping())
                    {
                        reply = p.Send(ip_serv, 500);
                    }
                        if (reply.Status == IPStatus.Success)//если пинг идёт 
                        {
                            using (con = new NpgsqlConnection(_plug.conn))
                            using (dadadada = new NpgsqlDataAdapter("Select ...", con))                            
                                using (dtdtdtdt = new DataTable())
                                {
                                    dadadada.Fill(dtdtdtdt);
                                    if (dtdtdtdt.Rows.Count == 1) { npp2 = Convert.ToInt32(dtdtdtdt.Rows[0][0]); }
                                }
                            using (con = new NpgsqlConnection(_plug.conn))
                            using (dadadada = new NpgsqlDataAdapter("Select ...", con))                            
                                using (dtdtdtdt = new DataTable())
                                {
                                    dadadada.Fill(dtdtdtdt);
                                    if (dtdtdtdt.Rows.Count == 1) { npp3 = Convert.ToInt32(dtdtdtdt.Rows[0][0]); }
                                }                                                        
                                using (con = new NpgsqlConnection(_plug.conn))
                                using (da2 = new NpgsqlDataAdapter("Select ...", con))
                                using (dt3 = new DataTable())
                            {
                                    da2.Fill(dt3);
                                    if (dt3.Rows.Count >= 0 && dataGridView1.RowCount != dt3.Rows.Count)
                                    {
                                        dataGridView1.Invoke((Action)(() => dataGridView1.DataSource = dt3));
                                        if ((dataGridView1.Rows.Count - 1) < 0) { }
                                        else { dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]; }
                                    }
                                
                            }

                           
                                using (con = new NpgsqlConnection(_plug.conn))
                                using (da2 = new NpgsqlDataAdapter("Select...", con))
                                 using (dt3 = new DataTable())
                            {
                                    da2.Fill(dt3);
                                    if (dt3.Rows.Count >= 0 && dataGridView4.RowCount != dt3.Rows.Count)
                                    {
                                        dataGridView4.Invoke((Action)(() => dataGridView4.DataSource = dt3));
                                        if ((dataGridView4.Rows.Count - 1) < 0) { }
                                        else { dataGridView4.CurrentCell = dataGridView4.Rows[dataGridView4.Rows.Count - 1].Cells[0]; }
                                    }
                                
                            }

                           
                                using (con = new NpgsqlConnection(_plug.conn))
                                using (da2 = new NpgsqlDataAdapter("Select ....", con))
                                 using (dt3 = new DataTable())
                            {
                                    da2.Fill(dt3);
                                    if (dt3.Rows.Count >= 0 && dataGridView5.RowCount != dt3.Rows.Count)
                                    {
                                        dataGridView5.Invoke((Action)(() => dataGridView5.DataSource = dt3));

                                        if ((dataGridView5.Rows.Count - 1) < 0) { }
                                        else { dataGridView5.CurrentCell = dataGridView5.Rows[dataGridView5.Rows.Count - 1].Cells[0]; }
                                    }
                                
                            }

                            
                                using (con = new NpgsqlConnection(_plug.conn))
                                using (da2 = new NpgsqlDataAdapter("Select ....", con))
                                using (dt3 = new DataTable())
                            {
                                    da2.Fill(dt3);
                                    if (dt3.Rows.Count >= 0 && dataGridView6.RowCount != dt3.Rows.Count)
                                    {
                                        dataGridView6.Invoke((Action)(() => dataGridView6.DataSource = dt3));                                 
                                        if ((dataGridView6.Rows.Count - 1) < 0) { }
                                        else { dataGridView6.CurrentCell = dataGridView6.Rows[dataGridView6.Rows.Count - 1].Cells[0]; }
                                    }
                                
                            }

                            //проверка работы шлюза
                            #region
                                using (con = new NpgsqlConnection(_plug.conn))
                            using (da_svyaz = new NpgsqlDataAdapter("Select ...", con))                            
                                using (dt_svyaz = new DataTable())
                                {
                                    da_svyaz.Fill(dt_svyaz);
                                    if (dt_svyaz.Rows.Count == 1)
                                    {
                                        if (live_plc != Convert.ToInt32(dt_svyaz.Rows[0][0]))
                                        {
                                            toolStripStatusLabel5.ForeColor = Color.Black;
                                            toolStripStatusLabel5.BackColor = Color.LightGreen;
                                            fff = 0;
                                        }
                                        else
                                        {
                                            fff++;
                                        }
                                        if (fff == 5)
                                        {
                                            toolStripStatusLabel5.ForeColor = Color.White;
                                            toolStripStatusLabel5.BackColor = Color.Red;
                                            fff = 0;
                                        }
                                        live_plc = Convert.ToInt64(dt_svyaz.Rows[0][0]);
                                    }
                                }
                            
                            #endregion
                            exep_funk = 0;
                            toolStripStatusLabel3.ForeColor = Color.Black; toolStripStatusLabel3.BackColor = Color.LightGreen;

                            pingg = 0;
                            toolStripStatusLabel1.ForeColor = Color.Black; toolStripStatusLabel1.BackColor = Color.LightGreen;
                        }
                        else { pingg++; }
                        if (pingg >= 5)
                        {
                            toolStripStatusLabel1.ForeColor = Color.White; toolStripStatusLabel1.BackColor = Color.Red;
                            toolStripStatusLabel3.ForeColor = Color.White; toolStripStatusLabel3.BackColor = Color.Red;
                            toolStripStatusLabel5.ForeColor = Color.White; toolStripStatusLabel5.BackColor = Color.Red;
                        }                      
                    
                    status = true;
                }
            }
            catch
            {
                exep_funk++;
                if (exep_funk >= 5)
                {
                    toolStripStatusLabel3.ForeColor = Color.White;
                    toolStripStatusLabel3.BackColor = Color.Red;
                }
                status = true;
            }


например...
...
Рейтинг: 0 / 0
07.07.2017, 14:00
    #39484537
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Roman Mejtes, вчера всю процедуру
Код: c#
1.
2.
void StartTime(){
}

закоментил, оставил до утра,как было так и осталось, остается думать только в реализации самой процедурЫ
...
Рейтинг: 0 / 0
07.07.2017, 14:04
    #39484540
Addx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888,
ну тогда согласен с
Roman Mejtes ... понять, где у вас утечки из данного куска кода не представляется возможным. ...

У Вас так получается - "вот мой код (не имеющий прямого отношения к делу), а где-то в другом месте - утечки. Где?"
...
Рейтинг: 0 / 0
07.07.2017, 14:38
    #39484581
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Addxwild888,
ну тогда согласен с
Roman Mejtes ... понять, где у вас утечки из данного куска кода не представляется возможным. ...

У Вас так получается - "вот мой код (не имеющий прямого отношения к делу), а где-то в другом месте - утечки. Где?"

или я что-то не понимаю или или.. это весь код в процедуре, которая вызывается в бесконечном цикле..
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//класс
   public delegate void DelegateForTimePOTOK(DataGridView dataGridView10,DataGridView dataGridView7,DataGridView dataGridView8,DataGridView dataGridView1,DataGridView dataGridView2,
            DataGridView dataGridView3,DataGridView dataGridView5,DataGridView dataGridView6,DataGridView dgv8,Label label70,Label label71,Label label28,Label label29,Label label30,Label label32,
            Label bunk1, Label bunk2, Label bunk3, Label bunk4, Label bunk5, Label bunk6, Label bunk7, Label bunk8, Label bunk9, Label bunk10, Chart chart1, Chart chart2, StatusStrip statusStrip1);
      
        DelegateForTimePOTOK DelTimePOTOK;
  
        Thread potok1;
//форма
    DelTimePOTOK = new DelegateForTimePOTOK(StartTime);
//далее Load и бесконечный вызов.
...
Рейтинг: 0 / 0
07.07.2017, 15:23
    #39484647
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888//класс
public delegate void DelegateForTimePOTOK(DataGridView dataGridView10,DataGridView dataGridView7,DataGridView dataGridView8,DataGridView dataGridView1,DataGridView dataGridView2,
DataGridView dataGridView3,DataGridView dataGridView5,DataGridView dataGridView6,DataGridView dgv8,Label label70,Label label71,Label label28,Label label29,Label label30,Label label32,
Label bunk1, Label bunk2, Label bunk3, Label bunk4, Label bunk5, Label bunk6, Label bunk7, Label bunk8, Label bunk9, Label bunk10, Chart chart1, Chart chart2, StatusStrip statusStrip1);

Кошмарище! Бросай ты программистское ремесло.
...
Рейтинг: 0 / 0
07.07.2017, 15:42
    #39484673
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888Addxwild888,
ну тогда согласен с
пропущено...

У Вас так получается - "вот мой код (не имеющий прямого отношения к делу), а где-то в другом месте - утечки. Где?"

или я что-то не понимаю или или.. это весь код в процедуре, которая вызывается в бесконечном цикле..
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//класс
   public delegate void DelegateForTimePOTOK(DataGridView dataGridView10,DataGridView dataGridView7,DataGridView dataGridView8,DataGridView dataGridView1,DataGridView dataGridView2,
            DataGridView dataGridView3,DataGridView dataGridView5,DataGridView dataGridView6,DataGridView dgv8,Label label70,Label label71,Label label28,Label label29,Label label30,Label label32,
            Label bunk1, Label bunk2, Label bunk3, Label bunk4, Label bunk5, Label bunk6, Label bunk7, Label bunk8, Label bunk9, Label bunk10, Chart chart1, Chart chart2, StatusStrip statusStrip1);
      
        DelegateForTimePOTOK DelTimePOTOK;
  
        Thread potok1;
//форма
    DelTimePOTOK = new DelegateForTimePOTOK(StartTime);
//далее Load и бесконечный вызов.


вот это делегатище.... лол
по факту, чтоб понять где утечка, надо видеть картину целиком.
используйте профайлер, по истечении 1-2 дней, вы снимите снапшот и увидите, говно будет везде, трудно будет его не найти.
Используйте событие Load осторожно, не знаю как в WinForms, но в WPF это событие возбуждается каждый раз, как объект оказывается в визуальном дереве или когда изменяются системные настройки системы в плане дизайна интерфейса и др. случаях. Гарантировать, что он не сработает 2ы вы не можете. И не совсем понятно, зачем вы запускаете это из формы. Форму нужно вообще исключить из работы этого потока. Форма должна быть отдельно, если нужно взаимодействие в видео прогресс бара, есть соответствующие классы для этого.
передавать контролы в независимый поток крайне нежелательно, ссылки на них должны не покидать пределов STA потока.
...
Рейтинг: 0 / 0
08.07.2017, 12:51
    #39485044
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
AddxИ вообще какая-то очень странная программа.
+1
Бесконечный цикл с засыпанием потока во времена существования таймеров?

wild888,

Вы уверены, что за 1 секунду отработают все "запросов около 10 + 2графика" ?
...
Рейтинг: 0 / 0
08.07.2017, 17:07
    #39485129
wild888
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
Cat2AddxИ вообще какая-то очень странная программа.
+1
Бесконечный цикл с засыпанием потока во времена существования таймеров?

wild888,

Вы уверены, что за 1 секунду отработают все "запросов около 10 + 2графика" ?

были сомнения, но я сделал булевый флаг на случай
Код: c#
1.
2.
3.
4.
5.
6.
if(flag==true)
{
flag=false;
//выполнение
flag=true;
}



вчера всё-таки я поменял потоки на таймер, и ооо чудо, уже сутки в работе и память на месте)))
...
Рейтинг: 0 / 0
10.07.2017, 18:25
    #39486017
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Framework4.0 утечка памяти в потоках
wild888Cat2пропущено...

+1
Бесконечный цикл с засыпанием потока во времена существования таймеров?

wild888,

Вы уверены, что за 1 секунду отработают все "запросов около 10 + 2графика" ?

были сомнения, но я сделал булевый флаг на случай
Код: c#
1.
2.
3.
4.
5.
6.
if(flag==true)
{
flag=false;
//выполнение
flag=true;
}



бросай это дело, даже в 3 строчках умудрился наговнокодить


вчера всё-таки я поменял потоки на таймер, и ооо чудо, уже сутки в работе и память на месте)))
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Framework4.0 утечка памяти в потоках / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]