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

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

Загрузка XML из сети в службе TService


zorik ©   (2010-08-17 16:51:00) 

Помогите разобратся. Создаю службу. В событии OnStart запускаю TThread который с интервалом 2 сек посылает ReportStatus ProcessRequests(false) и считает количество секунд. Приопределенном количестве (интервал приблизительно час) стартует второй TThread в котором загружаются данные их XML в инете (с сайта погоды).

Вот тут то и вся загвоздка. Я уже много перепробовал. Пробовал отдельно CoInitialize в секцию Synchronize засунуть и всю процедуру загрузки - не помогает. Пробовал создать тестовый пример с потоком и загрузкой в нем - там все работает, а в службе не хочет


zorik   (2010-08-18 09:29:00) [1]

Так и есть! Под ненастроеным юзером не работает. Спасибо!


zorik   (2010-08-17 19:43:00) [2]

Спасибо! Завтра попробую. Кажется понял в чем причина


Медвежонок Пятачок   (2010-08-17 18:16:00) [3]

ну зачем же напрягать штатные средства винды?
здесь просто таки стопудово необходим самопальный сервис с десятью нитями.

Но сервис и тестовый пример я запускаю у себя на локальном компе

создай на компе нового юзера и зайди им.
браузер на настраивай. и сразу запусти тестовую программу (не сервис).
и будешь немного удивлен.


zorik   (2010-08-17 18:13:00) [4]

Самое простое в планировщике заданий забить чтоб 4 раза в день запускать обычную екзешку)))


Медвежонок Пятачок   (2010-08-17 18:13:00) [5]

Но сервис и тестовый пример я запускаю у себя на локальном компе

и чего из этого следует?
всем строиться?


Медвежонок Пятачок   (2010-08-17 18:12:00) [6]

но там по-моему Acces Violation

а по моему если там АВ, то иф не пойдет по ветке иф-нот


zorik   (2010-08-17 18:12:00) [7]

Через прокси. Но сервис и тестовый пример я запускаю у себя на локальном компе


zorik   (2010-08-17 18:11:00) [8]

Согласен, что "очень информативно", переделаю, но там по-моему Acces Violation


Медвежонок Пятачок   (2010-08-17 18:10:00) [9]

здесь висит на методе DOM.load(XMLLink) несколько минут и потом ошибка

поди инет через прокси.
в браузере юзера он настроен и потому в простой приладе все работает


zorik   (2010-08-17 18:09:00) [10]

const XMLLink  = ' http://informer.gismeteo.ru/xml/33526_1.xml';

Не работает DOM.load(XMLLink)


Медвежонок Пятачок   (2010-08-17 18:07:00) [11]

if not DOM.load(XMLLink) then
    raise Exception.Create('Ошибка');

обработка иф-нот конечно зашибенная.
информативная по самое нехочу.


zorik   (2010-08-17 18:07:00) [12]

Я менял текст процедуры TWeatherThread.LoadXML на простой запись в файл -- все корректно работает -- пишет с нужным интервалом, пробовал в отдельном проекте создать поток и в нем считать данный в Synchrinize -- тоже все ок. А здесь висит на методе DOM.load(XMLLink) несколько минут и потом ошибка


Медвежонок Пятачок   (2010-08-17 18:06:00) [13]

Ну и как ты определил-то, что в сервисе не работает?


zorik   (2010-08-17 18:04:00) [14]


procedure TWeatherThread.LoadXML;
var
 i: Integer;
 T: TStringList;
 y, m, d, h: Word;
begin
 try
   CoInitialize(nil);
   DOM := CoDOMDocument.Create;
   DOM.async := False;
   if not DOM.load(XMLLink) then
     raise Exception.Create('Ошибка');
   nData   := DOM.SelectSingleNode('MMWEATHER');
   nReport := nData.SelectSingleNode('REPORT');
   nTown   := nReport.SelectSingleNode('TOWN');
   ...
 except
   on E:Exception do
   begin
     FErrCode := 1;
     T := TStringList.Create;
     if FileExists('C:\1.txt') then
       T.LoadFromFile('C:\1.txt');
     T.Add(DateTimeToStr(now) + ' - ' + E.Message);
     T.SaveToFile('C:\1.txt');
     T.Free;
   end;
 end;


Медвежонок Пятачок   (2010-08-17 18:00:00) [15]

и как ты определил, "в сервисе что не работает"?


zorik   (2010-08-17 17:57:00) [16]


procedure TWeatherThread.Execute;
begin
 Synchronize(LoadXML);
end;


zorik   (2010-08-17 17:55:00) [17]


procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
 Started := True;
 TimerThread := TTimerThread.Create(True);
 TimerThread.FreeOnTerminate := True;
 TimerThread.Resume;  
end;

procedure TTimerThread.Execute;
var
 k: Integer;
begin
 k := 0;
 repeat
   if k = 0 then
   begin
     WeatherThread := TWeatherThread.Create(True);
     WeatherThread.FreeOnTerminate := True;
     WeatherThread.Resume;
   end;
   k := k + 1;
   if k >= 60 then k := 0;
   sleep(2000);
   Service1.ReportStatus;
   Service1.ServiceThread.ProcessRequests(false);
 until false;
end;

procedure TWeatherThread.LoadXML;
begin
   CoInitialize(nil);
   DOM := CoDOMDocument.Create;
   DOM.async := False;
   DOM.load(XMLLink)
   nData   := DOM.SelectSingleNode('MMWEATHER');
   ...
end;


Медвежонок Пятачок   (2010-08-17 17:38:00) [18]

И что характерно:
челу система говорит, что коинициалайз не был вызван, а чел настаивает на том, что был вызван.
и идет на форум.


Сергей М.   (2010-08-17 17:38:00) [19]


> Вот тут то и вся загвоздка


"тут" это где ?
проблема-то в чем ?


> много перепробовал


> не помогает


Дустом их посыпать не пробовал ?)


> загружаются данные их XML в инете


Святым духом загружаются ?
Может соизволишь конкретизировать как они загружаются ?


Наверх

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