Re[7]: IB & быстрая вставка записей по TTimer
От: mrhru Россия  
Дата: 25.11.03 01:48
Оценка:
Здравствуйте, solon, Вы писали:

S>//опрашиваю по таймеру-есть ли новые записи с частотой 250 мсек.

S>procedure TForm1.Timer1Timer(Sender: TObject);
S>begin
S>//Посмотрим обновленные данные
S> //IBTable1.Close; // может работать и
S>// IBTable1.Open; // без переоткрытия
S> IBTable1.Refresh;
S> IbTable1.Last;
S>//..нужна последняя запись
S>end;

S>Это всё работает, но загружает процессор почти на 100 процентов

S>да и плюс сетку тоже нагружает на тот случай когда запрашиваем
S>есть ли новые записи, а их пока нет.
S> МОЖЕТ ВСЕТАКИ НА САМОМ ИНТЕРБАЙСЕ ЕСТЬ ОПЦИЯ НАСТРАИВАЕМАЯ,
S>КОТОРАЯ ПОСЫЛАЕТ ОБНОВЛЕННЫЕ ДАННЫЕ ПОДСОЕДИНЕННЫМ КЛИЕНТАМ
S>(ОТКРЫТЫМ ТАБЛИЦАМ)???

Опрашивать о новых записях можно и менее ресурсоёмко.
Например, снабжаем каждую запись уникальным ID (который почти наверняка уже есть ), создаваемым в триггере на вставку с помощью отдельного генератора.
А затем по таймеру получаем значение этого генератора и сравниваем с запомненым. При изменении — refresh.

Для получения значения генератора лучше всего использовать TIBSQL и запрос:

SELECT GEN_ID( MY_GENERATOR, 0) AS ID FROM RDB$DATABASE;

Далее, если записи в таблицу могут только вставляться, то вместо полного обновления IBTable1.Refresh (тяжёлая процедура), дешевле просто получать новые записи (по тому же ID) и отображать их (уже вручную).


Другой способ получения уведомлений — компонент TIBEvent. С его помощью регистрируем на сервере события, в которых заинтересованы.
На самом сервере в триггерах при наступлении события выполняем POST_EVENT <строка>. TIBEvent получает его и делаем refresh.
При этом не надо постоянно опрашивать сервер, но сама работа с events — требует аккуратности.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.