BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> C#, StringBuilder, OutOfMemoryException
NikB
Публикувано на: 04-06-2018, 08:52
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1043
Регистриран на: 22.09.05



Преди известно време си направих механизъм за логване бързи случки в един CAN тул за Windows.
За буфер ползвам StringBuilder и данните от него ги извеждам в richTextBox и файл.
Виждам, че ако оставя дълго да се логва, StringBuilder sb прави OutOfMemoryException - картинката.

Описание на АЛГОРИТТЪМА:
- пристигат някакви пакети (с влучея CAN) по няколко десетки (стотин) в секунда);
- пакетите се добавят към StringBuilder sb;
- няколко (3-4) пъти в секунда се проверява дали в sb има нещо, и, ако има, се прехвърля в richTextBox и файл (И ДАННИТЕ В sb СЕ ИЗТРИВАТ - това е проблемното - нулирането се оплаква с OutOfMemoryException - след няколко часа работа).

А, да - да допълня - richTextBox-а също е ограничен, в случея - на 100КБ ето я цялата функция:

CODE
       public void Log_Update()
       {
           if (sb.Length > 0)
           {

               if (fileLog != null)
               {
                   fileLog.LogLine("{0}", sb);
                   ToolStrip_CounterUpdate(toolStripStatusLabel_LogInFile, ref Counter_LogInFile, sb.Length);
               }

               if (checkBox_LogToView.Checked)
               {
                   if (richTextBox_Log.Text.Length > LOG_SIZE_MAX)
                   {
                       sb.Insert(0, richTextBox_Log.Text.Substring(richTextBox_Log.Text.Length - LOG_SIZE_KEEP));
                       richTextBox_Log.Text = sb.ToString();
                   }
                   else
                   {
                       richTextBox_Log.AppendText(sb.ToString());
                   }

                   if (checkBox_LogCaretToEnd.Checked)
                   {
                       richTextBox_Log.SelectionStart = richTextBox_Log.Text.Length;
                       richTextBox_Log.ScrollToCaret();
                   }
                   Counter_LogInView = (UInt32)(richTextBox_Log.Text.Length);
                   ToolStrip_CounterUpdate(toolStripStatusLabel_LogInView, ref Counter_LogInView, 0);
               }

               ToolStrip_CounterUpdate(toolStripStatusLabel_LogTotal, ref Counter_LogTotal, sb.Length);
               ToolStrip_CounterUpdate(toolStripStatusLabel_LogAll, ref Counter_LogAll, sb.Length);
               //sb.Clear(); S603
               sb.Length = 0; //S603
           }
       }





Къде да ровя? icon_smile.gif Благодаря !

Това мнение е било редактирано от NikB на 04-06-2018, 08:52

Прикачена картинка (Кликнете на картинката, за да я увеличите!)
Прикачена картинка
PMEmail Poster
Top
stewie
Публикувано на: 04-06-2018, 09:55
Quote Post



Име:
Група: Форумен член
Ранг: Почетен член

Мнения: 3827
Регистриран на: 14.07.16



StringBuilder бута всичко в паметта, пробвай да си пренапишеш кода със StreamWriter.
PM
Top
NikB
Публикувано на: 04-06-2018, 10:04
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1043
Регистриран на: 22.09.05



QUOTE (stewie @ 04-06-2018, 09:55)
StringBuilder бута всичко в паметта, пробвай да си пренапишеш кода със StreamWriter.

StreamWriter за файл е идеално, но за view ми трябва нещо, в което да се пише често (стотици и повече icon_smile.gif пъти в секунда), а да се прехвърля към вюто рядко - 3-4 пъти в секунда.
PMEmail Poster
Top
kierenski
Публикувано на: 04-06-2018, 11:08
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 270
Регистриран на: 10.01.16



QUOTE (NikB @ 04-06-2018, 10:04)
QUOTE (stewie @ 04-06-2018, 09:55)
StringBuilder бута всичко в паметта, пробвай да си пренапишеш кода със StreamWriter.

StreamWriter за файл е идеално, но за view ми трябва нещо, в което да се пише често (стотици и повече icon_smile.gif пъти в секунда), а да се прехвърля към вюто рядко - 3-4 пъти в секунда.

Ами използвай пре-буфер. Пълниш го до някъде и после го изсипваш във файл, т.е. правиш нещата на парчета.
PMEmail Poster
Top
NikB
Публикувано на: 04-06-2018, 13:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1043
Регистриран на: 22.09.05



не те разбирам (или не съм запитал правилно, или не си разбрал icon_smile.gif ) :
StreamWriter за файл е идеално, но за view ми трябва нещо, в което да се пише често (стотици и повече icon_smile.gif пъти в секунда), а да се прехвърля към вюто - (към нещо визуално, да речем RichTextBox - това е проблема) рядко - 3-4 пъти в секунда.
Нали за пребуфер съм се опитал да ползвам StringBuilder icon_smile.gif
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 04-06-2018, 13:18
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 928
Регистриран на: 21.02.18



Не е зле да прочетеш темата за управление по таймер и ще ти се изяснят някои работи


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
NikB
Публикувано на: 04-06-2018, 13:54
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1043
Регистриран на: 22.09.05



QUOTE (Gamma Goblin @ 04-06-2018, 13:18)
Не е зле да прочетеш темата за управление по таймер и ще ти се изяснят някои работи

Шегуваш ли се icon_smile.gif,
Тук виждам само тази тема:
http://forums.bgdev.org/index.php?showtopic=16641
PMEmail Poster
Top
thrawn
Публикувано на: 04-06-2018, 14:05
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



https://forums.bgdev.org/index.php?showtopic=50427

Намекът е, че подходът ти е погрешен. Ако не се лъжа, това го бяхме обсъждали вече.

Това мнение е било редактирано от thrawn на 04-06-2018, 14:05
PMEmail Poster
Top
NikB
Публикувано на: 04-06-2018, 14:15
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1043
Регистриран на: 22.09.05



Разбрах, мерси icon_smile.gif, но, icon_smile.gif, нали това обсъждаме - предложете верния подход icon_smile.gif.
PMEmail Poster
Top
thrawn
Публикувано на: 04-06-2018, 14:17
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1651
Регистриран на: 17.01.17



Данни които постъпват със скорост от стотици в секунда нямат място на монитор. Там можеш да извеждаш статистика, известия за нередности но не и живи данни.
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0