Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 цикла в потоке сжирают память / 25 сообщений из 41, страница 1 из 2
07.01.2018, 22:35
    #39580404
Sergey-2008
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Доброе время суток,
имеется поток, который каждые 10 сек, читает лог.
В нем имеется 2 цикла, которые анализируют последнюю строку лога, и выделяют из нее значения нужных мне параметров (для отображения их в программе). И как показали опыты, эти циклы почему-то сжирают память (если их закоментировать то с память сжираться не будет)
Код: pascal
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.
procedure TFileReadThread.UpdTemp1;
begin
  FMain.edTemp1.Clear;
  FMain.edTemp1.Text := Pr_ValTemp;
end;
 
procedure TFileReadThread.CLEAR_VALUE_VIDEO;  
begin
  Pr_ValGPU := '';
  Pr_ValTemp := '';
  Synchronize(UpdGPU0);
  Synchronize(UpdTemp0);
  Synchronize(UpdGPU1);
  Synchronize(UpdTemp1);
end;
 
procedure TFileReadThread.Execute;
var
  LFile: TStringList;
  w, LIndex, LIndex1, LNumGPU, L_Length: integer;
  q, LValue, LStringParams: string;
  LValueTrue: boolean;
begin
  while not Terminated do
  begin
    try
      CLEAR_VALUE_VIDEO;
      Pr_Status := 'File begin reading';
      Pr_Status_Color := clGreen;
      Synchronize(UpdStatus);
 
      LFile := TStringList.Create;
      LFile.LoadFromFile(PathFile);  
//q:=LFile.Strings[1];                                  
//w:=LFile.Count;
      L_Length := LFile.Count-1;
      LStringParams := '';
      LValueTrue := false;
      LValue := '';
      LNumGPU := 0;
 
      for LIndex := L_Length downto 0 do
        if Pos('GPU0', LFile.Strings[LIndex]) <> 0 then
        begin
          LStringParams := LFile.Strings[LIndex];
          for LIndex1 := 0 to length(LStringParams) do
          begin
            if (LStringParams[LIndex1] in ['0'..'9']) then
              LValue := LValue+LStringParams[LIndex1]
            else
              if ((LStringParams[LIndex1] = '.')
                or (LStringParams[LIndex1] = ','))
                and (LValue <> '') then
              begin
                LValue := LValue+'.';
                LValueTrue := true;
              end
              else 
              begin
                if (LStringParams[LIndex1] = ' ')
                  and (LValueTrue) then
                begin
                  if (FMain.edGPU0.Text = '')
                    and (LNumGPU = 0) then
                    begin
                      Pr_ValGPU := LValue;
                      Synchronize(UpdGPU0);   
                    end;
                  if (FMain.edGPU1.Text = '')
                    and (LNumGPU = 1) then
                    begin
                      Pr_ValGPU := LValue;
                      Synchronize(UpdGPU1);   
                    end;
                  inc(LNumGPU);  
                end  
                else LValueTrue := false;
                LValue := '';  
              end;
          end;  
          break;
        end;
 
      LValue := '';
      LNumGPU := 0;
      for LIndex := L_Length downto 0 do
        if Pos('GPU0 t=', LFile.Strings[LIndex]) <> 0 then
        begin
          LStringParams := LFile.Strings[LIndex];
          for LIndex1 := 0 to length(LStringParams) do
          begin
            if (LStringParams[LIndex1] in ['0'..'9']) then
              LValue := LValue+LStringParams[LIndex1]
            else
              begin
                if (LStringParams[LIndex1] = 'C') then
                begin
                  if (FMain.edTemp0.Text = '')
                    and (LNumGPU = 0) then
                    begin
                      Pr_ValTemp := LValue;
                      Synchronize(UpdTemp0);   
                    end;
                  if (FMain.edTemp1.Text = '')
                    and (LNumGPU = 1)  then
                    begin
                      Pr_ValTemp := LValue;
                      Synchronize(UpdTemp1);   
                    end;
                  inc(LNumGPU);  
                end  
                else LValueTrue := false;
                LValue := '';  
              end;
          end;  
          break;
        end;
 
        Pr_Status := 'File end reading';
        Pr_Status_Color := clGreen;
        Pr_Sleep := IntToStr(ASleep);
//        ASleep := ASleep*1000;
        Synchronize(UpdStatus);
 
        FreeAndNil(LFile);
    except
    on E: Exception do
      begin
        Pr_Status := 'Not access to file';
        Pr_Status_Color := clRed;
        Synchronize(UpdStatus);
        FreeAndNil(LFile);
      end
    end;
  end;  
end;


что в этих циклах может память не отдавать... теряюсь в догадках

Заранее спасибо за ответ
...
Рейтинг: 0 / 0
07.01.2018, 22:48
    #39580410
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Sergey-2008что в этих циклах может память не отдавать... теряюсь в догадках

FastMM + FullDebugMode помогут найти ответ на этот вопрос.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.01.2018, 23:03
    #39580413
Sergey-2008
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Да еще если поток зациклить, то окажеться что с памятью будет все норм., т.е. программа ее не будет захламлять
...
Рейтинг: 0 / 0
07.01.2018, 23:06
    #39580414
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Sergey-2008,

кода мало.
Например, ты в цикле обращаешься к CLEAR_VALUE_VIDEO, в которой сбрасываешь строки:

Код: pascal
1.
2.
  Pr_ValGPU := '';
  Pr_ValTemp := '';


Что за Pr_ValGPU, Pr_ValTemp? Если это - "глобальные" переменные, живущие вне контекста нити - вот тебе и утечка.
...
Рейтинг: 0 / 0
07.01.2018, 23:46
    #39580430
Sergey-2008
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
чччД,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
  TFileReadThread = class(TThread)
    private
    { Private declarations }
  protected
    Pr_Sleep, Pr_ValTemp0, Pr_ValTemp1, Pr_ValGPU0, Pr_ValGPU1, PathFile, Pr_Status: string;
    Pr_Status_Color: TColor;
    ASleep: integer;
    procedure Execute; override;
    procedure CLEAR_VALUE_VIDEO;
    procedure EDIT_VALUE_VIDEO;
    procedure UpdErrStatus;    
  public

    constructor Create(APathFile: String;
                       A_Sleep: integer);      
  end;
...
Рейтинг: 0 / 0
07.01.2018, 23:52
    #39580432
Sergey-2008
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Но в "Pr_ValTemp", "Pr_ValGPU" хранятся только цифры
Каждый раз при выполнени потока, память увеличивается на 100КБ. (всего я храню в переменных 4 числа)
...
Рейтинг: 0 / 0
08.01.2018, 01:23
    #39580441
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Sergey-2008имеется поток, который каждые 10 сек, читает лог.
а где в приведенном коде участок, который подтверждает данное заявление?

я к тому, что цикл без слипа
Код: pascal
1.
2.
3.
4.
while True do
begin
//sleep(1000);
end;


весьма чувствительно напрягает ЦП даже при единственном запущенном доп.потоке. Если же их запустить несколько, то там будет еще интереснее
...
Рейтинг: 0 / 0
08.01.2018, 01:34
    #39580445
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Док,

похоже, ТС исследует уязвимость типа Meltdown. :)
...
Рейтинг: 0 / 0
08.01.2018, 08:36
    #39580471
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
чччД,

ТС, похоже, только начал изучать потоки. До сообщений в основной поток пока не дошел. Видишь, как Synchronize интенсивно использует. Следующим этапом будет попытка использовать компонент wadman'а :)
...
Рейтинг: 0 / 0
08.01.2018, 10:05
    #39580483
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
а вот тут явно не с нуля надо индекс перебирать

Код: pascal
1.
2.
3.
  for LIndex1 := 0 to length(LStringParams) do
          begin
            if (LStringParams[LIndex1] in ['0'..'9']) then
...
Рейтинг: 0 / 0
08.01.2018, 12:30
    #39580504
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Sergey-2008
Код: pascal
1.
while not Terminated do

Terminate не обнаружено
Sergey-2008имеется поток, который каждые 10 сек, читает лог.Никакой приостановки потока тоже не обнаружено.

Не создаете ли Вы каждые 10 секунд новый поток?
...
Рейтинг: 0 / 0
08.01.2018, 13:47
    #39580528
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Sergey-2008,

1. Удаляй созданные объекты всегда строго в try-finally;
2. Полностью откажись от synchronize.

Потом можно будет дальше говорить.
...
Рейтинг: 0 / 0
08.01.2018, 15:25
    #39580564
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
YuRock2. Полностью откажись от synchronize.
Кстати, а чем вы так синхронайз не любите? Они же вроде, в последних версиях, их переделали?
...
Рейтинг: 0 / 0
08.01.2018, 15:52
    #39580569
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
alekcvpYuRock2. Полностью откажись от synchronize.
Кстати, а чем вы так синхронайз не любите? Они же вроде, в последних версиях, их переделали?
но осадочек остался (с)

P.S. Я пользуюсь синхронайзом без зазрения совести, если вижу в нём необходимость.
...
Рейтинг: 0 / 0
08.01.2018, 16:12
    #39580573
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
alekcvpа чем вы так синхронайз не любите?

Его ограниченность на запуск методом без параметров и отсутствие возможности вернуть
результат лично меня напрягают. Глобальные переменные (даже локально-глобальные поля
класса) - зло.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.01.2018, 16:23
    #39580581
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Dimitry Sibiryakovalekcvpа чем вы так синхронайз не любите?

Его ограниченность на запуск методом без параметров и отсутствие возможности вернуть
результат лично меня напрягают. Глобальные переменные (даже локально-глобальные поля
класса) - зло.
глобальные переменные, "запуск методом без параметров" и "отсутствие возможности вернуть
результат" намешал опять в одну кучу ?
...
Рейтинг: 0 / 0
08.01.2018, 16:28
    #39580583
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Ну смотри: когда я использую SendMessage, то могу ему прямо передать два параметра и прямо
же вернуть число. Synchronize так не может, приходится использовать методы с побочными
эффектами и передавать значения через поля класса.
Когда я использую PostMessage, то работа продолжается без ожидания, чего Synchronize опять
же не может.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.01.2018, 16:40
    #39580591
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Dimitry Sibiryakov,

так ты не передавай, кто мешает в стэке выделить?
...
Рейтинг: 0 / 0
08.01.2018, 16:50
    #39580593
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Dimitry SibiryakovНу смотри: когда я использую SendMessage, то могу ему прямо передать два параметра и прямо
же вернуть число. Synchronize так не может, приходится использовать методы с побочными
эффектами и передавать значения через поля класса.
Когда я использую PostMessage, то работа продолжается без ожидания, чего Synchronize опять
же не может.
ну есть же разные необходимости синхронизации

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

пинг вещь длинная, городить вокруг этого SendMessage-PostMessage нет смысла
если раз в пять секунд произойдёт Synchronize от пинговального потока,
нет ничего страшного.

Это я просто пример привёл, если что
...
Рейтинг: 0 / 0
08.01.2018, 17:02
    #39580594
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
defecatorЭто я просто пример привёл, если что

Забавно, что ты привёл как раз пример, где ни Synchronize, ни любая другая синхронизация
вообще не требуются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.01.2018, 17:05
    #39580597
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
Dimitry SibiryakovdefecatorЭто я просто пример привёл, если что

Забавно, что ты привёл как раз пример, где ни Synchronize, ни любая другая синхронизация
вообще не требуются.
с твоей точки зрения - не требуется
с моей точки зрения - требуется.
...
Рейтинг: 0 / 0
08.01.2018, 20:57
    #39580686
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
defecatorесли раз в пять секунд произойдёт Synchronize от пинговального потока,
нет ничего страшногоИ чем этот пинговальный поток будет лучше таймера в главном потоке? Названием только красивым.
...
Рейтинг: 0 / 0
08.01.2018, 21:08
    #39580692
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
YuRockdefecatorесли раз в пять секунд произойдёт Synchronize от пинговального потока,
нет ничего страшногоИ чем этот пинговальный поток будет лучше таймера в главном потоке? Названием только красивым.
за 5 секунд произойдёт десяток попыток пинга внутри потока,
а результат вылезет наружу только раз в пять секунд.

Зачем главному потоку вообще знать о том, что там что-то такое постоянно работает ?
...
Рейтинг: 0 / 0
08.01.2018, 21:12
    #39580695
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
alekcvpYuRock2. Полностью откажись от synchronize.
Кстати, а чем вы так синхронайз не любите? Они же вроде, в последних версиях, их переделали?Не знаю, что там сейчас, но тем, что до D7, пользоваться было нельзя по большому ряду причин. К счастью, в этом и нет никакой необходимости.
Стандартный набор граблей synchronize можно увидеть и самому, посмотрев реализацию, ну например:
1. Вызов synchronize навсегда зависнет, если его вызвать до Application.Run;
2. Навсегда зависнет, если вообще и не планировался вызов Application.Run (dll, консоль,...);
3. Навсегда зависнет, если работает еще один цикл обработки сообщений, запущенный при обработке сообщения в Application.Run;
4. Невозможность управления потоками, висящими на synchronize. Другие методы синхронизации дают такую возможность.

Первые три пункта далеко не всегда зависят от разработчика. Поэтому если кто-то наговнокодил с synchronize - другим приходится мучиться или переделывать.
...
Рейтинг: 0 / 0
08.01.2018, 21:15
    #39580697
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
2 цикла в потоке сжирают память
defecatorYuRockпропущено...
И чем этот пинговальный поток будет лучше таймера в главном потоке? Названием только красивым.
за 5 секунд произойдёт десяток попыток пинга внутри потока,
а результат вылезет наружу только раз в пять секунд.

Зачем главному потоку вообще знать о том, что там что-то такое постоянно работает ?Я думал у тебя сам пинг в синхронайз делается раз в пять секунд.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 2 цикла в потоке сжирают память / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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