Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Долгий запуск сервиса  (Прочитано 8166 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
sss
Специалист

ru
Offline Offline

« : 25-07-2006 04:01 » 

Всем привет.
Такое дело, необходимо написать службу, которая бы запускалась, допустим, минут 20 - 30. При этом система не должна принять решение, что она зависла. Как это сделать? Какие статусы она должна возвращать?
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-07-2006 07:41 » 

sss, таймер запусти

или по GetTickCount() отследи время, но подкачивай сообщения

(хотя это я как про приложение, с сервисом дела не имел Улыбаюсь )
Записан

sss
Специалист

ru
Offline Offline

« Ответ #2 : 25-07-2006 09:12 » 

Ну я так и делал. Первый раз указывал системе что время на запуск необходимо 30 секунд. Через  25 секунд, инкрементировав чекпойнт, опять выдавал статус, что необходимо 30 секунд. в общем минуты 3 -4 выдерживает. Затем хана, система принимает решение что сервис завис. Иногда приходит код INTERROGATE. Служба сбрасывает чекпойнт в ноль и выставляет что необходимо 30 секунд на запуск. Не получается Жаль
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-07-2006 13:33 » 

sss, а код нарисуй, где ты время отслеживаешь?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 25-07-2006 13:37 » 

sss, Кстати и зачем тебе это? Может есть другие пути решения твоей задачи?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
sss
Специалист

ru
Offline Offline

« Ответ #5 : 26-07-2006 01:02 » 

Finch, задача, которую я решаю, создать что то вроде сигнала. Мне нужен запуск чужих служб после какого то условия.
Например задача ожидания доступности ресурса в сети: я создаю службу ожидающую русурс, а в зависимости от нее указываю эти самые чужие службы. Понимаю, что ее можно решить в лоб - жестко работать с конкретными службами.

Код довольно сложно собрать в кучу. Попробую...

Первый вызов установки статуса службы.
(основной поток службы сразу же за точкой входа)
Код:
  TIME_THREAD_TAG TimeTag;
  CTimeThread*    worker;   //класс поток-таймер
 
  TimeTag.Interval = DC_CHECK_INTERVAL; 
  TimeTag.pExecProc = &WaitForDcController; //точка пульса потока-таймера
  TimeTag.pUserParam = this;
  worker = new CTimeThread( TimeTag);
  if ( worker->Continue( 1500))
  {
    Status.dwWaitHint = SERVICE_CHECK_INTERVAL;
    Status.dwCurrentState = SERVICE_START_PENDING;
    Status.dwCheckPoint = 1; // Или все же 0?
    SetServiceStatus( Handle, &Status);
  }

Точка пульса потока-таймера.
(дополнительный поток службы)
Код:
BOOL THREADAPI WaitForDcController(PTIME_THREAD_TAG pTag)
{
  DWORD                   dwRes;
  PDOMAIN_CONTROLLER_INFO dcinfo;
  CServiceWrapper*  srv = (CServiceWrapper*) pTag->pUserParam;
 

  //Оповещение SCM об продолжении загрузки
  srv->Status.dwCheckPoint++;
  srv->Status.dwWaitHint = SERVICE_CHECK_INTERVAL;
  srv->Status.dwCurrentState = SERVICE_START_PENDING;
  srv->SendStatus();

  dwRes = DsGetDcName( NULL, CHECK_DOMAIN_NAME, NULL, NULL, DC_FLAGS, &dcinfo);
  if ( dwRes == ERROR_SUCCESS || dwTestTimer >= CHECK_MAX_WAIT)
  {
    if ( dwRes == ERROR_SUCCESS)
    {
      dwTestTimer = 0;     
      g_EventLog.ReportInfo(0, DC_FOUND_SUCCESS, dcinfo->DomainControllerName);
      NetApiBufferFree( dcinfo);
    }
    else
    {
      g_EventLog.ReportError(0, DC_FOUND_FAILED, itocstr( CHECK_MAX_WAIT / 1000));
    }
    srv->Status.dwCheckPoint = 0;
    srv->Status.dwWaitHint = 0;
    srv->Status.dwCurrentState = SERVICE_RUNNING;
    srv->SendStatus();
    return FALSE;
  }
  else
  {
    dwTestTimer += pTag->Interval;
    return TRUE;
  }
}

Реакция на код INTERROGATE.
(поток SCM)
Код:
VOID SERVICEAPI CServiceWrapper::OnInterrogate()
{
  g_EventLog.ReportInfo(0, SRV_INTERROGATE_ACCEPTED);
  Status.dwCheckPoint = 0;
  Status.dwWaitHint = 0;
  SendStatus();
}

Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #6 : 14-08-2006 03:05 » new

Черт возьми! Разобрался наконец. Оказывается в один из моментов вызов DsGetDcName занимал 16800 миллисекунд! А я выставлял wait hint службы равный 6000 ! Так что статусы правильны!
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines