Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление записей, Зависает программа 
:(
    Опции темы
MrForget
Дата 30.4.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.4.2006

Репутация: нет
Всего: нет



Такое дело. На форме есть DBGrid с имеющимися данными из таблицы MSAccess. Ежесекундно по таймеру таблица изменяется, например так:
Код

procedure TForm1.TimerTimer(Sender: TObject);
begin
 Data.workcompanies.First;
 Application.ProcessMessages;
 while not Data.workcompanies.Eof do
  begin
   Application.ProcessMessages;
   Data.Companies.Edit;
   Data.Companies.FieldByName('UCapital').AsCurrency:=Data.WorkCompanies.FieldByName('UCapital').AsCurrency-1;
   Data.Companies.Post;
   Data.companies.Next;
  end;
 Application.ProcessMessages;
end;
При этом в DBGrid начинает бегать ползунок. Суть в том, что пользователь двойным кликом мыши должен кликнуть в DBGrid по интересующей записи и таймер должен остановиться и показаться окно с полными сведениями о выбранной записи. Когда окно закрывается, таймер должен вновь включиться. Проблема в том, что когда прогу запускаю и активизируется таймер прога подвисает и юзер уже не может выбрать интересующую его запись. Доходит даже до того, что юзер не может закрыть даже главное окно программы. Необходимо сделать так чтобы в DBGrid ползунок не бегал и юзер мог свободно выбирать любую запись и просматривать ее содержимое, а так же при даблклике останавливал таймер... Спасибо 
PM MAIL   Вверх
The Thing
Дата 30.4.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: нет
Всего: 3



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

Считываешь к-во записей (таким же интервалом) и если оно изменилось, то производишь обновление. Так ты съэкономишь много времени и памяти (особенно если большая база).

Другой вариант, если база очень часто обновляется, при этом как добавляется, так и удаляется из нее информация, т.е. может так совпасть, что одна запись добавилась, а другая удалилась.. в сумме ничего не изменилось. То можно добавить проверку информации. Например:
Считать помимо к-во записей, если к-во записейсовпадает, количество каждой первой буквы по алфавиту (к примеру так).
1. Самое главное, чтобы обработка этой проверки и добавления записи занимала меньгше секунды.. иначе сам знаешь что!

2. или перед обработкой останавливай таймер, а после запуска!

3. Любой подходящий алгоритм поиска информации. 


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Юзверь
Дата 30.4.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2006
Где: IF.UA

Репутация: нет
Всего: нет



действительно надо сделать другой алгоритм апдейта
а в этом случая код следает немножко изменить

procedure TForm1.TimerTimer(Sender: TObject);    
begin    
 Data.workcompanies.First;    
// Application.ProcessMessages;    
Data.disableControls; //отключаем отображение наших действий на форме
 while not Data.workcompanies.Eof do    
  begin    
   Application.ProcessMessages;    
   Data.Companies.Edit;    
   Data.Companies.FieldByName('UCapital').AsCurrency:=Data.WorkCompanies.FieldByName('UCapital').AsCurrency-1;    
   Data.Companies.Post;    
   Data.companies.Next;    
Application.ProcessMessages;    // это надо делать в цикле иначе толку мало
  end;    
Data.enableControls; //включаем отображение наших действий на форме
// Application.ProcessMessages;    
end;

 Application.ProcessMessages;    
считывать сообщения сисьемы из очереди и исполняет их, приложение ето делает постоянно но при больших циклах ето делаеть после них и приложения перестають пририсувиватся ... и т.д.
Data.enableControls; 
все контролы (TDBGrig) которые выводять инфо из дата сета не обновляются (при этом значения на пропадають). команди типа next не приводат к изменению положения курсара

идеальный вариант этот кусок вывести в отдельный поток. 
PM MAIL ICQ   Вверх
MrForget
Дата 1.5.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.4.2006

Репутация: нет
Всего: нет



Спасибо, за код. Очень пригодился. Но прога все равно подвисает. НИчего не могу с ней поделать. Хотелось бы, чтобы юзер мог выделять любую строку в DBGrid. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.