Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

Загрузка XML из сети в службе TService   Найти похожие ветки 

 
zorik ©   (2010-08-17 16:51) [0]

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

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


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

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


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


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


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


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


> не помогает


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


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


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


 
zorik ©   (2010-08-17 17:55) [3]


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;


 
zorik ©   (2010-08-17 17:57) [4]


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


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

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


 
zorik ©   (2010-08-17 18:04) [6]


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:06) [7]

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


 
zorik ©   (2010-08-17 18:07) [8]

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


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

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

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


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

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

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


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

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

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


 
zorik ©   (2010-08-17 18:11) [12]

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


 
zorik ©   (2010-08-17 18:12) [13]

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


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

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

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


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

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

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


 
zorik ©   (2010-08-17 18:13) [16]

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


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

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

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

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


 
zorik ©   (2010-08-17 19:43) [18]

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


 
zorik ©   (2010-08-18 09:29) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2010.11.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
2-1282119287
A_Ton
2010-08-18 12:14
2010.11.14
Запись типизированных файлов больше 2 гиг


15-1280438963
Германн
2010-07-30 01:29
2010.11.14
W7 90-days trial version


2-1281704590
Axel54
2010-08-13 17:03
2010.11.14
Запись инфомации по помещению в БД


15-1280868339
Медвежонок Пятачок
2010-08-04 00:45
2010.11.14
php, json_encode


15-1280483751
KilkennyCat
2010-07-30 13:55
2010.11.14
DrawText в 2010