![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление данных на форме [D7]
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]ок! покажи код второго, и иди домой :))