czy warto czyścić memo przy prowadzeniu logów?

0

W jednym programiku jak coś się dzieje, to zapisywane jest to w TMemo tak dodatkowo, jako LOG (taki podgląd zdarzeń np. 20 linijek co 5-60 sekund). W przypadku, gdyby program był włączony przez wiele godzin, to trochę sporo mogłoby się tego zebrać. Wtedy to wszystko w pamięci będzie trzymane domyślnie, tak? (w ramie?). Te logi nie są istotne za bardzo więc zapisywać ich do pliku txt np. co kilkaset/kilka tysięcy linii nie chcę, ale może warto byłoby czyścić TMemo co jakiś czas? I tu pytanie, co jaki, co ile linii najlepiej? (jak wspomniałem, nie są istotne więc może to być nawet auto czyszczenie co 100 linii). I czy gdyby w Memo było teoretycznie 100 000 linii (lub milion), to program by mulił przez to (i ile ramu by zjadł ten tekst)?

btw. nie chcę żadnego kodu, chcę prosić tylko odpowiedzi na powyższe pytania, nic więcej :)

0

Jeżeli user nie musi widzieć tych logów na żywo, czemu nie użyjesz TStringList+jakieś zapisywanie w wątku (np.co minutę)?


i ile ramu by zjadł ten tekst

Tak na logikę (przyjmując, że jeden znak = 1 bajt, a w każdej linii znajduje się średnio 20 znaków):
100000*20/1024/1024 = 1.9 MB

0
Patryk27 napisał(a):

Jeżeli user nie musi widzieć tych logów na żywo, czemu nie użyjesz TStringList+jakieś zapisywanie w wątku (np.co minutę)?


i ile ramu by zjadł ten tekst

Tak na logikę (przyjmując, że jeden znak = 1 bajt, a w każdej linii znajduje się średnio 20 znaków):
100000*20/1024/1024 = 1.9 MB

user ma widzieć te logi jeśli chce, by wiedzieć dodatkowo, że działa wszystko jak należy. Logi w pliku txt są zbędne, nawet jak wyłączy program, bo nie będzie widział sensu, by otwierać je i czytać. Raczej też nie będzie scrollował ich, po prostu w trakcie działania programu jeśli będzie chciał to rzuci okiem na drobne memo na dole, by zobaczyć co się dzieje w tej chwili.

btw. a może zrobię tak, że zamiast Memo.Clear; przy np. 100 liniach, program wywali 50 pierwszych linii?, krótko mówiąc, zawsze w memo będzie coś w logu i nigdy nie będzie cały wyczyszczony

0

i nigdy nie będzie cały wyczyszczony

Więcej danych w logu = więcej zajętej pamięci = mniej wolnej pamięci = spowolnienie działania całego komputera


Najlepiej (i najprościej) jest stworzyć wątek/timera, który będzie co np.godzinę czyścił logi.
0

a dla przykładu:

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Byte;
begin
  if (Memo1.Lines.Count >= 10) then
  begin
    for i:= 0 to 4 do
    begin
      Memo1.Lines.Delete(0); //wywal 5 razy pierwsza linijke (czyli 5 pierwszych linii)
    end;
  end;
end;

taki sposób będzie w porządku? Nie muszę się wtedy martwić już o nic?

0

taki sposób będzie w porządku? Nie muszę się wtedy martwić już o nic?

Wtedy musisz się martwić o naciskanie guzika.

0
-123oho napisał(a):

taki sposób będzie w porządku? Nie muszę się wtedy martwić już o nic?

Wtedy musisz się martwić o naciskanie guzika.

to był tylko przykład
równie dobrze, mogę odpalić wątek ze sleepem 1000 ms, timera lub w OnChange Memo dać to sprawdzanie ile jest linii. Zdarzenie OnChange w Memo będzie najlepszym rozwiązaniem? Bo w takim przypadku nie ma sensu się przejmować, że przy każdej zmianie w memo, program będzie liczył linie itd, bo to i tak jest drobnostka niezauważalna dla procesora, zgadza się?

3

A nie lepiej sobie napisać procedurę w stylu:

procedure AddToLog(LogStr: string);
begin
  if Memo1.Lines.Count = 50 then
    Memo1.Lines.Delete(0);
  Memo1.Lines.Add(LogStr);
end;

i za pomocą jej dodawać wpisy wtedy będziesz memo max 50 linii

1 użytkowników online, w tym zalogowanych: 0, gości: 1