powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Framework4.0 утечка памяти в потоках
15 сообщений из 15, страница 1 из 1
Framework4.0 утечка памяти в потоках
    #39484290
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графика(там только чищу точки и заново добавляю их в цикле...)

}
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484408
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Framework4.0 утечка памяти в потоках
    #39484409
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fix: XML сериализацию
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484415
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wild888,
И что из этого потока сознания понять можно?
Ваш код не будет работать в принципе, и мне непонятно, каким образом Вы привели реальный код к такому состоянию.
По сути Вы убрали все существенное и оставили какую-то ерунду.
По тому, что есть.
Вы можете гарантировать, что Form1_Load срабатывает один раз?
Что поток когда-либо завершается?
И вообще какая-то очень странная программа.
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484526
wild888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, сериализацию не использую. профайлер есть, но я пока не особо с ним подружился(единственное что в нем видно - это тип string постоянно растущий).
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484529
wild888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Addxwild888,
И что из этого потока сознания понять можно?
Ваш код не будет работать в принципе, и мне непонятно, каким образом Вы привели реальный код к такому состоянию.
По сути Вы убрали все существенное и оставили какую-то ерунду.
По тому, что есть.
Вы можете гарантировать, что Form1_Load срабатывает один раз?
Что поток когда-либо завершается?
И вообще какая-то очень странная программа.

"Вы можете гарантировать, что Form1_Load срабатывает один раз?" -ДА
"Что поток когда-либо завершается?"-точно не могу сказать но глядя в диспетчер задач, потоки не растут.
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484534
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.
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
Framework4.0 утечка памяти в потоках
    #39484537
wild888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, вчера всю процедуру
Код: c#
1.
2.
void StartTime(){
}

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

У Вас так получается - "вот мой код (не имеющий прямого отношения к делу), а где-то в другом месте - утечки. Где?"
...
Рейтинг: 0 / 0
Framework4.0 утечка памяти в потоках
    #39484581
wild888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Framework4.0 утечка памяти в потоках
    #39484647
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Framework4.0 утечка памяти в потоках
    #39484673
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Framework4.0 утечка памяти в потоках
    #39485044
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AddxИ вообще какая-то очень странная программа.
+1
Бесконечный цикл с засыпанием потока во времена существования таймеров?

wild888,

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

wild888,

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

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



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

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

wild888,

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

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



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


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


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