Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизTThread и работа с базой Найти похожие ветки
← →
Lex_! © (2005-05-13 18:40) [0]в нижеприведенном коде - проход в потоке выполняеться один раз нормально, далее второй и далее проходы по базе просто не читают с нее ничего ...
база акцес, таблици Адоprocedure GetStatus.Execute;
const cycle=1;
var
vHttp: OleVariant;
i:integer;
ci:integer;
url,status,newstatus:string;
limit:boolean;
str:TStringList;
begin
vHttp := CreateOleObject("Microsoft.XMLHTTP"); { Requires IE5 }
str:=TStringList.Create;
while cycle=1 do
begin
For i:=1 to dm.alllogins.RecordCount do
begin
limit:=false;
ci:=1;
dm.alllogins.RecNo:=i;
str.Text:="";
status:=Trim(dm.alllogins.FieldByName("status").AsString);
url:=dm.alllogins.fieldByName("url").AsString;
try
vHttp.open("GET", url, False, EmptyParam, EmptyParam);
vHttp.send("");
str.Text := vHttp.responseText;
except
end;
while (str.Text="") and (limit=false) do
begin
dm.citys.RecNo:=ci;
url:=Trim(dm.citys.FieldByName("city").AsString+"inf.pl?short=1&login=");
url:=url+Trim(dm.alllogins.FieldByName("Login").AsString);
try
vHttp.open("GET", url, False, EmptyParam, EmptyParam);
vHttp.send("");
str.Text := vHttp.responseText;
except
ci:=ci+1;
if ci>dm.citys.RecordCount then limit:=true;
end;
end;
if limit=false then
begin
dm.alllogins.Edit;
newstatus:=str.Values["login_online"];
dm.alllogins.FieldByName("city").AsString:=str.Values["gamecity"];
dm.alllogins.FieldByName("url").AsString:=url;
dm.alllogins.FieldByName("status").AsString:=newstatus;
if status<>newstatus then
begin
dm.alllogins.Post;
Synchronize(RefreshGrid);
end else dm.alllogins.Post;
end;
end;
Synchronize(RefreshGrid);
Delay(300000);
end;
end;
← →
Cobalt © (2005-05-13 19:05) [1]В потоке при работе с ОЛЕ , помнится, надо выполнить Initialize-что-то-там...
← →
Lex_! © (2005-05-13 19:14) [2]На первый проход все нормально все работает.
а вот на второй после делея....
← →
sniknik © (2005-05-13 21:30) [3]> а вот на второй после делея....
вот в нем все и дело, где его код? подозреваю что в нем используется Application.ProcessMessages или чтото такое же недопустимое в потоке.
замени на Sleep
← →
Lex_! © (2005-05-14 04:11) [4]
procedure Delay(msecs : Longint);
var
FirstTick : longint;
begin
FirstTick:=GetTickCount;
repeat
until GetTickCount-FirstTick >= msecs;
end;
так как это поток а не в основном окне программы я ProcessMessages убрал ...
Проблема именно с базой... из нее толи не читается толи читаются старые параметры... не обновленное всмысле....
еще там есть рефрешprocedure GetStatus.RefreshGrid;
begin
dm.tabfr.Requery();
dm.alllogins.Requery();
end;
← →
Anatoly Podgoretsky © (2005-05-14 08:08) [5]Убивать из рогатки, функция полностью идентичная Sleep, за исключением того что постоянно жрет все доступные ресурсы процессора, разогревая его до больших температур.
← →
Digitman © (2005-05-14 08:24) [6]что такое alllogins ? TADOTable ? TADOQuery ?
где уничтожение стринг-листа ?
← →
Lex_! © (2005-05-14 10:41) [7]
> Digitman © (14.05.05 08:24) [6]
> что такое alllogins ? TADOTable ? TADOQuery ?
>
> где уничтожение стринг-листа ?
Так он при каждом проходе создаваться будет заново?.. не катит что раз создал и он существуе себе только данные меняются?...
alllogins - ADOTable
> Убивать из рогатки, функция полностью идентичная Sleep,
> за исключением того что постоянно жрет все доступные ресурсы
> процессора, разогревая его до больших температур.
Слип это у потока такое?... или где?.. не видел не знаю про такую потому пользуюсь делеем... поподробнее можно?..
← →
Anatoly Podgoretsky © (2005-05-14 10:43) [8]Подробнее не надо, просто замени в коде Delay на Sleep, а если хочешь подробнее, то посмотри в справке
← →
Digitman © (2005-05-14 10:57) [9]
> Так он при каждом проходе создаваться будет заново?
судя по твоему коду, он единожды создается и нигде не уничтожается
> не катит что раз создал и он существуе себе только данные
> меняются?
когда твой поток завершит свою работу, твой стринг-лист так и останется в памяти ... потерянным ... это есть мемлик (memory leak = утечка памяти)
> alllogins - ADOTable
справку по RecNo property (TCustomADODataSet) читал ?
Note: The number of rows indicated might be less than the total number of rows in a table. This can happen when the rows retrieved as a recordset for a dataset component are a conditional subset of the table.
к тому же сегодня у тебя Access-база, а завтра будет другая, где твое фривольное использование RecNo приведет к неработоспособности алгоритма.
для перемещения по записям в TDataSet есть стандартные универсальные методs, которые в отличии от RecNo будут гарантированно и с неменьшей эффективностью работать для любых НД в любой СУБД - first, last, next, prev
поэтому вместо своего for-цикла используй такой цикл:
with dm.alllogins do
begin
first;
while nor eof do
begin
..
next;
end;
end;
хуже уж точно не будет, зато будет гарантия корректной навигации по НД
← →
sniknik © (2005-05-14 11:11) [10]а почему именно
> после делея....
может в RefreshGrid-е в бесконечный цикл входит?
почему бы не сделать трассировку?
мже еще оно вываливается после первого цикла/в нем тогда тоже второй работать не будет но вроде про ошибки ничего не говорилось... и защитить код (try exept/finally) все одно бы не помешало.
← →
Lex_! © (2005-05-14 13:10) [11]
> > Так он при каждом проходе создаваться будет заново?
>
>
> судя по твоему коду, он единожды создается и нигде не уничтожается
>
>
> > не катит что раз создал и он существуе себе только данные
>
> > меняются?
>
>
> когда твой поток завершит свою работу, твой стринг-лист
> так и останется в памяти ... потерянным ... это есть мемлик
> (memory leak = утечка памяти)...
const cycle=1
...
begin
...
while cycle=1 do
begin
....
end;
поток существует все время существования программы.
> к тому же сегодня у тебя Access-база, а завтра будет другая,
> где твое фривольное использование RecNo приведет к неработоспособности
> алгоритма.
база была и будет Access, никаких фильтров нет, по идее все должно работать ... щас попробую заменить на правельные методы.. :)
← →
Lex_! © (2005-05-14 13:16) [12]А RecNo максимум может быть такое же как RecordCount или на единицу меньше?.... (нумерация с нуля или с единици)
← →
evvcom © (2005-05-14 13:35) [13]
> const cycle=1
> while cycle=1 do
Тогда уж
while True do
- без лишних телодвижений
← →
Digitman © (2005-05-14 13:44) [14]
> поток существует все время существования программы
и что ?
разве это повод для пренебрежения "правилами хорошего тона", предписывающими таки убирать за собой мусор ?
← →
Lex_! © (2005-05-14 13:56) [15]
> > поток существует все время существования программы
>
>
> и что ?
> разве это повод для пренебрежения "правилами хорошего тона",
> предписывающими таки убирать за собой мусор ?
Тогда как его убивать?... когда поток прекращается... точнее когда программа закрывается где описать обязательные действия в потоке?....
далее:
переделал код теперь так выглядит:
procedure GetStatus.RefreshGrid;
begin
dm.tabfr.Requery();
dm.alllogins.Requery();
end;procedure GetStatus.Execute;
var
vHttp: OleVariant;
i:integer;
ci:integer;
url,status,newstatus:string;
limit:boolean;
str:TStringList;
begin
vHttp := CreateOleObject("Microsoft.XMLHTTP"); { Requires IE5 }
str:=TStringList.Create;
while true do
begin
dm.alllogins.First;
while not dm.alllogins.Eof do
begin
dm.citys.First;
str.Text:="";
status:=Trim(dm.alllogins.FieldByName("status").AsString);
url:=dm.alllogins.fieldByName("url").AsString;
try
vHttp.open("GET", url, False, EmptyParam, EmptyParam);
vHttp.send("");
str.Text := vHttp.responseText;
except
end;
while (str.Text="") and (not dm.citys.eof) do
begin
url:=Trim(dm.citys.FieldByName("city").AsString+"inf.pl?short=1&login=");
url:=url+Trim(dm.alllogins.FieldByName("Login").AsString);
try
vHttp.open("GET", url, False, EmptyParam, EmptyParam);
vHttp.send("");
str.Text := vHttp.responseText;
except
dm.citys.Next;
end;
end;
if str.text<>"" then
begin
dm.alllogins.Edit;
newstatus:=str.Values["login_online"];
dm.alllogins.FieldByName("city").AsString:=str.Values["gamecity"];
dm.alllogins.FieldByName("url").AsString:=url;
dm.alllogins.FieldByName("status").AsString:=newstatus;
dm.alllogins.Post;
if status<>newstatus then Synchronize(RefreshGrid);
end;
dm.alllogins.Next
end;
end;
Synchronize(RefreshGrid);
sleep(10000)
end;
грабли те же на первый раз проходит и все...
← →
Lex_! © (2005-05-14 14:03) [16]
if status<>newstatus then Synchronize(RefreshGrid);
end;
dm.alllogins.Next
end;
end;
Synchronize(RefreshGrid);
sleep(10000)
end;
>if status<>newstatus then Synchronize(RefreshGrid);
end;
dm.alllogins.Next
end;
Synchronize(RefreshGrid);
sleep(10000)
end;
end;
← →
Lex_! © (2005-05-14 17:39) [17]В общем никак я не могу разобраться и все....
← →
Lex_! © (2005-05-14 20:29) [18]
vHttp := CreateOleObject("Microsoft.XMLHTTP"); { Requires IE5 }
а тут граблей быть не может?.... если второй раз прокидывать те же ссылки он не может брать старые значения там или ченить такое7...
по идее то код работать должен.. вот если там кеш какой у этого vHttp ... тогда старые значения остаются и в принципе тогда понятно почему глюки ....
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.05 c