BG Development


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

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



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

Мнения: 1085
Регистриран на: 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



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

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



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



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

Мнения: 1085
Регистриран на: 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



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

Мнения: 310
Регистриран на: 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



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

Мнения: 1085
Регистриран на: 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



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

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



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


--------------------
Бе наш този свят преди да дойде човекът и нямаше място за богове
Отново ще бъде, но само че нека човешкият род да ги прибере
Изсъхват морета рушат се скалите, луната завинаги да свети ще спре
Ще паднее Господ Бог от звездите и всичко що диша в този ден ще умре
Тогава земята ще стане на пепел, свидетели ще бъдат само пясък и жар
И никой не ще помни дали нявга е светил ликът на отреченият бивш господар
PMEmail PosterUsers Website
Top
NikB
Публикувано на: 04-06-2018, 13:54
Quote Post



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

Мнения: 1085
Регистриран на: 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



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

Мнения: 1986
Регистриран на: 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



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

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



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



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

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



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

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

 


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