Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Заблокирован
.NET 3.x

Как бороться с утечкой памяти в приложении при его длительной работе

13.05.2012, 07:44. Показов 1346. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

Началось все с того, что после недельной бесперерывной работы программы у Датагрида справа на полосе прокрутки пропали треугольники "вверх" и "вниз".

Копнул глубже: утечка.

Код примерно такой(в таймере вызывается несколько таких функций с разными начальными данными):
VB.NET
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
Function Read****() As Integer
 
        Dim Success As Boolean
        Dim BytesWritten, BytesRead As Int32
        Dim bout() As Byte = {&HFF, &H31} '&H31=49' запрос
        Dim bin() As Byte = {0, 0, 0, 0, 0, 0, 0, 0, 0} ' ответ
 
        Try
            ' очистка очереди чтения и записи
            PurgeComm(Port****.Ptr, PURGE_RXCLEAR)
            PurgeComm(Port****.Ptr, PURGE_TXCLEAR)
 
            ' Запись данных в порт.
            Success = WriteFile(Port****.Ptr, bout, bout.Length, BytesWritten, IntPtr.Zero)' винапишная функция записи в com-порт
            If Success = False Then
                'Throw New CommException("Не удается записать данные в порт")
                PictureBox1.BackColor = Color.Red
                Return -1
            End If
 
            Success = ReadFile(Port****.Ptr, bin, bin.Length, BytesRead, IntPtr.Zero)' винапишная функция чтения из com-порта
            If Success = False Then
                'Throw New CommException("Не удается прочитать данные из порта")
                PictureBox1.BackColor = Color.Red
                Return -1
            End If
        Catch ex As Exception
            PictureBox1.BackColor = Color.Red
            Return -1
        End Try
        If (bin(0) <> &H40 Or BytesRead <> 9) Then '
            TextBox1.Text = ""
            For i As Integer = 0 To 8
                TextBox1.Text += Hex(bin(i)) + " " ' этот текстбокс скрыт от юзера, в режиме отладки я вижу его
            Next
 
            PictureBox1.BackColor = Color.Blue
            Return -1
        Else
            PictureBox1.BackColor = Color.Green
 
        End If
 
        Dim t_ves As String = ""
 
        Try
            t_ves = Encoding.ASCII.GetString(bin, 2, 6)
        Catch
            PictureBox1.BackColor = Color.Black
            Return -1
        End Try
 
        ' запись в базу текущих показателей, чтоб другие юзеры видели и им было радостно
        Try
            cmd.CommandText = "UPDATE IndVes SET " & "Ves='" & t_ves & "', LastTime='" & Format(Now, "yyyy-MM-dd HH:mm:ss") & "' WHERE ID=1" 
            cmd.Prepare()
            cmd.ExecuteNonQuery()
        Catch
            LabelNoConDB.Visible = True
            PictureBox1.BackColor = Color.DarkViolet
            Return -1
        End Try
        PictureBox1.BackColor = Color.Green
        Return t_ves
 
    End Function
PictureBox1 - индикатор для отлова ошибок, таймер срабатывает раз в секунду.
Мало того, что железо глючное - еще и утечка памяти присутствует.
Никаких обьектов не создаю, чтоб можно было диспозить их.

Пока вижу такие варианты решения проблеммы:
-Добавить таймер, который будет срабатывать раз в полчаса и принудительно вызывать GC.Collect() и GC.(здесь функция чтоб сразу, сейчас не помню).
-Ограничить размер программы занимаемый ею в оперативке через винапишные функции.

PS: сейчас на домашнем компьютере, но как-то думаю об этом, а то вздрючат на работе.

Добавлено через 6 минут
DoEvents() в таймере вызываю, может здесь в двух случаях нужно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2012, 07:44
Ответы с готовыми решениями:

Как бороться с утечкой памяти?
Добрый день! у меня такая проблема: в моей программе видимо где-то проблемы с утечкой памяти. если много раз запустить - закрыть прогу,...

Setjmp, longjmp, malloc - как бороться с утечкой памяти
Здравствуйте! Вот небольшой тестовый пример, в котором, как я понимаю, free(buf) никогда не выполнится. exit(...) борится только с...

При длительной работе программа зависает
Доброго времени суток вот кусок кода procedure TForm1.Timer2Timer(Sender: TObject); var Result,Result1: THandle; ...

5
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
13.05.2012, 11:02
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
VB.NET
1
TextBox1.Text += Hex(bin(i)) + " "
Возможно здесь будет слишком большая строка через неделю?
Больше я не узрел ничего подозрительного.
1
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
13.05.2012, 11:03
Dzhej-Dzhej, как правило, большинства утечек кроется в неправильном коде, что-то где неправильно написано или недописано. Тогда придется искать узкое место место с помощью отладки и профилирования кода - пару статей на тему - http://msdn.microsoft.com/ru-r... 87.aspx#S1 и
http://msdn.microsoft.com/ru-ru/library/7fe0dd2y
Если же все нормально с кодом, просто интенсивное такое приложение, которое создает кучу объектов и сборщик мусора не успевает все их подчищать, тогда GC.Collect и тп.
1
Заблокирован
13.05.2012, 11:11  [ТС]
Цитата Сообщение от cergew Посмотреть сообщение
Возможно здесь будет слишком большая строка через неделю?
Строка обнуляется перед заполнением(по коду я это вижу).
cergew, спасибо за ответ, пытаюсь докопаться до причины утечки, принимаются самые крышеслетные варианты.
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
13.05.2012, 11:22
Цитата Сообщение от Dzhej-Dzhej Посмотреть сообщение
Строка обнуляется
Да, обнуляется. Прошу прощенья - не заметил
0
Заблокирован
13.05.2012, 12:06  [ТС]
Eugene22, я читаю статьи наподобие - не помогает.
Цитата Сообщение от Eugene22 Посмотреть сообщение
Тогда придется искать узкое место место с помощью отладки и профилирования кода
Не могу себе позволить, т.к. прога на клиентской машине, сэмулировать не могу (через моксы и прочее)
Еще с этим опросом ком-портов и устройств на них глючно как-то.

Просто утечка наблюдается.

Добавлено через 8 минут
Я бы рад был бы на "плюсах" переписать это дело(хоть MFC смутно помню, но без всяких фреймворков), так "политика партии" - нужно на ветке vb.

Добавлено через 30 минут
Код что в таймере(там несколько таких вызовов, привел код для одного):
VB.NET
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
Private Sub Timer****_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer****.Tick
        If (MyDebug) Then
            TempVes**** = IIf(TempVes**** > 30000, 0, TempVes**** + 150)
            tbVes****.Text = CStr(TempVes****)
        End If
        If (IsConnectBD) Then
            LabelNoConBD.Visible = False
            If (MyDebug) Then
                TempVes**** = IIf(TempVes**** > 30000, 0, TempVes**** + 150)
                tbVes****.Text = CStr(TempVes****)
            Else
                Dim ves As Integer
                ves = Read****()
                Application.DoEvents()
                If (ves = -1) Then
                    'LabelNoConBD.Visible = True
                    'tbVes****.Text = "0" ' чтоб не смущать юзера
                Else
                    tbVes****.Text = ves
                End If
            End If
        Else
            LabelNoConBD.Visible = True
        End If
        If (tbDok****.Text <> "" And tbDok****.Text <> "0") Then ' если есть по документу
            ' foo = тара + вес по документу - вес на весах
            'If (WithOPC) Then
            '    Dim foo As Integer = CInt(tbDok****.Text) + CInt(tbTara****.Text) - CInt(tbVes***.Text)
            '    If (foo <= StopVes****) Then WriteOPC(1, True) 'Выключаем
            'End If
        End If
 
        Try ' фактический вес
            Dim vf As Integer = CInt(tbVes****.Text) - CInt(tbTara****.Text)
            tbDelta****.Text = IIf(vf > 0, CStr(vf), "0")
        Catch
        End Try
    End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2012, 12:06
Помогаю со студенческими работами здесь

BackgroundWorker зависает при длительной работе
Добрый вечер, Обрабатываю в отдельном потоке BackgroundWorker Excel файлы с большим количеством строк. Проблема в том, что если...

Чем забивается оперативная память при длительной работе ?
В последнее время стал замечать, что сумма используемой памяти в списке всех процессов не соответствует действительности. С вечера всё...

Как справиться с утечкой памяти в коде?
Есть вот такая форма internal partial class FindDialogForm&lt;T&gt; : XtraForm { public List&lt;T&gt; SelectedItems { get; private...

Какую модель ноутбука выбрать чтобы при длительной работе минимально уставали глаза
Ноутбук для работы, программирования, думаю лучше чтобы видеокарта была дискретная или интегрированная, обязательно хороший экран, я читал...

Как бороться с увеличением объема потребляемой оперативной памяти при сохранении файла Excel без закрытия?
Привет Всем! Вопрос такой, в программе написанной на VBA Ecxel я заметил такую штуку, при каждом сохранении без закрытия файла в ДиспЗадач...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru