Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.056 c
1-1118072378
Nimbus
2005-06-06 19:39
2005.06.29
Свойство "parent" для формы, размещённой в DLL?


1-1118060872
PONTIY
2005-06-06 16:27
2005.06.29
Создание объекта от переменной класса


1-1117619099
12345
2005-06-01 13:44
2005.06.29
Эффект 25 кадра


4-1114710007
MUHAMOR
2005-04-28 21:40
2005.06.29
Разные винды - разный результат


14-1117391999
Layner
2005-05-29 22:39
2005.06.29
Свой макроязык





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский