Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление данных на форме [D7]


Страницы:   1 2 3

chargos ©   (2008-05-30 15:25:00) 

Здравствуйте!
Подскажите, пожалуйста, в чем может быть проблема.
У меня есть 2 программы, которые работают с одной таблицей ADOTable одновременно.В первой программе по кнопке(в бесконечном цикле) проверяются нажатия клавиш и вносятся в таблицу в определенную строчку.
ADOTable.Edit;
......
ADOTable.Post;
ADOTable.Edit;
Во второй программе (тоже в бесконечном цикле) происходит чтение из этой же таблицы(с задержкой в секунду) и данные заносятся в соответствующие метки(TLabel), причем каждый раз таблица открывается и закрывается. Но данные на форме в метках не изменяются. Сначала подумал на Post(в первой программе). Добавил после него Close/ Open. Но это не помогло. Подскажите, в чем может быть дело?


ANB   (2008-06-03 14:59:00) [1]


> но как правило для промышленных и полу просмысленных SQL
> серверов

Эти выдают все честно и сразу после коммита. Независимо от кэширования.


Anatoly Podgoretsky   (2008-06-03 11:59:00) [2]

> chargos  (03.06.2008 9:21:54)  [54]

Так это не единственная задержка, еще есть кеш винчестера.
Но тебе уже сказали отключи кеширование записи, но потом не матюгайся.
Для баз это обычное поведение, но как правило для промышленных и полу просмысленных SQL серверов и с выделением отдельного диска под базу, а то и множества дисков.


chargos   (2008-06-03 09:21:00) [3]

Anatoly Podgoretsky ©  
А можно как-нибудь время этой задержки уменьшить?


Anatoly Podgoretsky   (2008-06-03 09:00:00) [4]

> chargos  (03.06.2008 8:37:52)  [52]

4 секунды это задержка сброса кеша на диск.


chargos   (2008-06-03 08:37:00) [5]

Stas ©  
> Давай так:
>3-е приложение в котором лежит грид подключенный к таблице, и таймер >500 м.с.на событие таймера делаем ADOTable1.Close; ADOTable1.Open;
>Что происходит?
То же самое, то есть данные в гриде обновляются спустя 3-4 секунды.


chargos   (2008-06-03 08:36:00) [6]

Stas ©
Первая программа изменяет данные в базе, вторая отображает их постоянно(вне зависимости от изменения базы). Данные обновляются в метки во второй программе. Т.е. во второй программе кнопку нажимаешь один раз и после этого данные постоянно обновляются.


Stas   (2008-06-02 16:13:00) [7]

chargos ©   (02.06.08 15:44) [48]

Давай так:
3-е приложение в котором лежит грид подключенный к таблице, и таймер 500 м.с.
на событие таймера делаем ADOTable1.Close; ADOTable1.Open;
Что происходит?


Stas   (2008-06-02 16:10:00) [8]

chargos ©   (02.06.08 09:18) [45]
т.е. если в 1-й программе изменили данные, во 2-й нажали на кнопку данные не изменились, через 3 сек, нжимаем на кнопку изменились?


chargos   (2008-06-02 15:44:00) [9]

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


Stas   (2008-06-02 14:30:00) [10]

MsGuns ©   (02.06.08 10:38) [46]
>SendMessage
Я думаю предпологается на разных машинах их использовать.


MsGuns   (2008-06-02 10:38:00) [11]

Убрать к тетушке ProcessMessages, обновление контролов сразу после перечитки (Requery), собственно перечитку после выполнения изменений. "Уведомление" показывающей формы о выполненный изменениях с помощью SendMessage из "изменяющей" формы.


chargos   (2008-06-02 09:18:00) [12]

Изменил немного код: Повесил весь этот код на кнопку(Button), вместо ADOTable2.Close написал ADOTable2.Requery(после Application.ProcessMessages;), убрал Таймер. Теперь обновляется нормально, но почему-то раз в три секунды. В первой проге стоит Грид, там обновляется нормально при нажатии. Не подскажете, в чем может быть причина такой задержки?


ANB   (2008-05-30 18:45:00) [13]


> procedure TStaticForm.Timer1Timer(Sender: TObject);
> begin
> if Ctrlc=0 then
> Ctrlc:=1;
> end;

У тебя опрос таблицы делается один раз при показе формы. Перенеси код :

открыть таблицу
прочитать данные
обновить инфу на форме
закрыть таблицу

в отдельный метод. И вызывай его из таймера.

ЗЫ. Зря посоветовал. Руки надо отрывать за такие решения.


Reindeer Moss Eater   (2008-05-30 17:48:00) [14]

в грид тоже из-за цикла нет новых данных?


Stas   (2008-05-30 17:32:00) [15]

Reindeer Moss Eater ©   (30.05.08 17:25) [41]
скорее всего у него цикл 1 раз прошел  и запрос не переоткрылся


Reindeer Moss Eater   (2008-05-30 17:25:00) [16]

>Ctrlc:=0; убрать на время.

>теперь положи второй грид на вторую форму в читающем приложении.
Положил - данные не обновляются....


Stas   (2008-05-30 17:23:00) [17]

>Ctrlc:=0; убрать на время.


chargos   (2008-05-30 17:14:00) [18]

Если что будет по-чайниковски - звиняйте :)
procedure TStaticForm.FormShow(Sender: TObject);
var
lab,lab1,lab2:TLabel;

begin

Ctrlc:=1;

LabFIO:=TStringList.Create;
LabYES:=TStringList.Create;
LabNO:=TStringList.Create;
ADOTable2.Open;
j:=ADOTable2.RecordCount;
ADOTable2.Close;
for i:=1 to j+1 do
 begin
   lab:=TLabel.Create(StaticForm);
   Lab.Parent:=StaticForm;
   lab1:=TLabel.Create(StaticForm);
   Lab1.Parent:=StaticForm;
   lab2:=TLabel.Create(StaticForm);
   Lab2.Parent:=StaticForm;
   LabFIO.AddObject('Label#'+IntToStr(i),Lab);
   LabYES.AddObject('Label#'+IntToStr(i),Lab1);
   LabNO.AddObject('Label#'+IntToStr(i),Lab2);
 end;

While Ctrlc>0 do
 begin
 i:=0;
 ADOTable2.Open;
 ADOTable2.First;
 While not ADOTable2.Eof do
 begin
 i:=i+1;

   TLabel(LabFIO.Objects[i]).Caption:=ADOTable2Name.AsString;
   TLabel(LabFIO.Objects[i]).Font.Size:=20;
   TLabel(LabFIO.Objects[i]).Font.Style:=[fsBold];
   TLabel(LabFIO.Objects[i]).Visible:=true;
   TLabel(LabFIO.Objects[i]).Height:=30;
   TLabel(LabFIO.Objects[i]).Left:=24;
   TLabel(LabFIO.Objects[i]).Top:=70*i;
   TLabel(LabFIO.Objects[i]).Width:=150;
 //
   TLabel(LabYES.Objects[i]).Caption:=IntToStr(ADOTable2Yes.AsInteger);
   TLabel(LabYES.Objects[i]).Font.Size:=20;
   TLabel(LabYES.Objects[i]).Font.Style:=[fsBold];
   TLabel(LabYES.Objects[i]).Visible:=true;
   TLabel(LabYES.Objects[i]).Height:=30;
   TLabel(LabYES.Objects[i]).Left:=275;
   TLabel(LabYES.Objects[i]).Top:=70*i;
   TLabel(LabYES.Objects[i]).Width:=150;
 //

   TLabel(LabNO.Objects[i]).Caption:=IntToStr(ADOTable2No.AsInteger);
   TLabel(LabNO.Objects[i]).Font.Size:=20;
   TLabel(LabNO.Objects[i]).Font.Style:=[fsBold];
   TLabel(LabNO.Objects[i]).Visible:=true;
   TLabel(LabNO.Objects[i]).Height:=30;
   TLabel(LabNO.Objects[i]).Left:=504;
   TLabel(LabNO.Objects[i]).Top:=70*i;
   TLabel(LabNO.Objects[i]).Width:=150;

 Application.ProcessMessages;
   ADOTable2.Next;
 end;
Ctrlc:=0;
Application.ProcessMessages;
ADOTable2.Close;
 end;

end;

procedure TStaticForm.Timer1Timer(Sender: TObject);
begin
if Ctrlc=0 then
Ctrlc:=1;
end;


chargos   (2008-05-30 17:08:00) [19]

Stas ©  
Нет, создаются они один раз, а потом в цикле меняются только Caption, Font, Left, Top и т.п.


Stas   (2008-05-30 17:07:00) [20]

ок! покажи код второго, и иди домой :))


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо