| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Обновление записей |
| Автор: MrForget 30.4.2006, 12:23 | ||
Такое дело. На форме есть DBGrid с имеющимися данными из таблицы MSAccess. Ежесекундно по таймеру таблица изменяется, например так:
|
| Автор: The Thing 30.4.2006, 13:47 |
| Скорее всего ты не правильно выбрал алгоритм обновления данных. Я так понял, что у тебя переодически обновляется база, в частности таблица. И ты пытаешься ее каждый раз обновить. Попробуй слеждующий подход, самый простой, и сразу приходит на ум: Считываешь к-во записей (таким же интервалом) и если оно изменилось, то производишь обновление. Так ты съэкономишь много времени и памяти (особенно если большая база). Другой вариант, если база очень часто обновляется, при этом как добавляется, так и удаляется из нее информация, т.е. может так совпасть, что одна запись добавилась, а другая удалилась.. в сумме ничего не изменилось. То можно добавить проверку информации. Например: Считать помимо к-во записей, если к-во записейсовпадает, количество каждой первой буквы по алфавиту (к примеру так). 1. Самое главное, чтобы обработка этой проверки и добавления записи занимала меньгше секунды.. иначе сам знаешь что! 2. или перед обработкой останавливай таймер, а после запуска! 3. Любой подходящий алгоритм поиска информации. |
| Автор: Юзверь 30.4.2006, 16:04 |
| действительно надо сделать другой алгоритм апдейта а в этом случая код следает немножко изменить 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 не приводат к изменению положения курсара идеальный вариант этот кусок вывести в отдельный поток. |
| Автор: MrForget 1.5.2006, 00:24 |
| Спасибо, за код. Очень пригодился. Но прога все равно подвисает. НИчего не могу с ней поделать. Хотелось бы, чтобы юзер мог выделять любую строку в DBGrid. |