Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2016, 12:07   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Лаги в DBGrid

Привет!

Юзаю DBGrid в связке с компонентов ClientDataSet. В таблице DBGrid через определенное время обновляются данные и на основе этих данных красятся ячейки в нужный цвет. Данные поступают от потоков в клон датасета, который имеет общий буфер данных с основным.

Изначально все работает достаточно шустро, но через пару дней активной работы программы, в таблице DBGrid начинаются жуткие лаги. Лаги приходят постепенно, по нарастающей. Чем дольше работает программа, тем сильнее лаги в DBGrid. Когда работать становится затруднительно, приходится перезапускать программу.

С чем может быть связано проявление лагов в DBGrid в данной ситуации?!
bilibian вне форума Ответить с цитированием
Старый 29.12.2016, 12:34   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Вы уверены что проблема в DBGrid, возможно лагает база?
Replicant вне форума Ответить с цитированием
Старый 29.12.2016, 12:48   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А DisableControls и EnableControls датасета на момент обновления не пробовал?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2016, 12:51   #4
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
Вы уверены что проблема в DBGrid, возможно лагает база?
Возможно, но это точно не связано с большим количеством строк (не более 50).
bilibian вне форума Ответить с цитированием
Старый 29.12.2016, 12:58   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А DisableControls и EnableControls датасета на момент обновления не пробовал?
Если честно, то нет не пробовал. Почитал об этом сейчас и думаю, что это может помочь в моей ситуации.

При обновлении данных мне стоит отключать оба датасета (основной и клон) или достаточно только тот через который обновляю?

Последний раз редактировалось bilibian; 29.12.2016 в 13:01.
bilibian вне форума Ответить с цитированием
Старый 29.12.2016, 13:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну гипотетически только основной, клон не имеет выходов на визуальные контролы. Нужно пробовать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2016, 13:44   #7
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

А может где утечка? С потоками вполне вероятно. Чем больше памяти утекло, тем ощутимее тормоза перерисовки. И не мешало бы OnDraw самого грида выложить сюда.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 29.12.2016 в 13:50.
Heneken87 вне форума Ответить с цитированием
Старый 29.12.2016, 14:24   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
И не мешало бы OnDraw самого грида выложить сюда.
Код:
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
begin
  if Column.Field.FieldName = 'Status' then
  begin
    DBGridEh1.Canvas.Font.Color := clWhite;

    if Column.Field.DisplayText = 'Да' then DBGridEh1.Canvas.Brush.Color := clGreen else
    if Column.Field.DisplayText = 'Нет' then DBGridEh1.Canvas.Brush.Color := clRed else
    if Column.Field.DisplayText = 'Неизвестно' then
    begin
      DBGridEh1.Canvas.Brush.Color := clSilver;
      DBGridEh1.Canvas.Font.Color := clBlack;
    end else
    if Column.Field.DisplayText = 'Проблемы' then DBGridEh1.Canvas.Brush.Color := clMaroon else
    if Column.Field.DisplayText = 'Ожидание' then
    begin
      DBGridEh1.Canvas.Brush.Color := clYellow;
      DBGridEh1.Canvas.Font.Color := clBlack;
    end;

    DBGridEh1.Canvas.Font.Style := [];
    DBGridEh1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;
bilibian вне форума Ответить с цитированием
Старый 29.12.2016, 14:31   #9
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
А может где утечка? С потоками вполне вероятно. Чем больше памяти утекло, тем ощутимее тормоза перерисовки.
В данном случае, скорее всего, тормоза прорисовки были бы у программы в целом, а так они имеются только в DBGrid и сильно ощущаются при использовании таблицы пользователем.
bilibian вне форума Ответить с цитированием
Старый 29.12.2016, 14:36   #10
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А DisableControls и EnableControls датасета на момент обновления не пробовал?
Еще заметил, что если, между промежутками DisableControls и EnableControls, выполнить операцию с таблицей, например, выделить пару строк, то имеют место глюки.
bilibian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неизвестные лаги Groztik Windows 11 06.11.2014 23:12
Жуткие лаги ForZe24 Windows 12 18.11.2013 15:51
Сильные лаги компа stepsav Свободное общение 17 31.05.2011 01:13
Лаги с кирилицей AIR_3 Общие вопросы C/C++ 1 05.05.2011 19:57
ЛАГИ Andrey174rus Операционные системы общие вопросы 2 16.10.2009 12:33