Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы со службой, помогите разобраться 
:(
    Опции темы
Litta
  Дата 13.11.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 14.3.2006

Репутация: нет
Всего: 1



Приветствую!
Помогите пожалуйста разобраться!
Недавно попробовал первый раз написать собственную службу!
Мне посоветовали, для удобства отладки организовать её слудующим образом - простенькая служба с автозапуском, которая при своём старте вызывает мою программу, в которой собственно и написан весь тот функционал, что должен исполняться! Собственно функционал простой - с 16 до 18 часов, залезть несколько раз на рбк и взять оттуда курсы валют.
Для отслеживания корректности расставил везде где мог try .. except-ы на тему что если не удалось то-то или то-то отправить мне на мыло письмо!
Написал, запускается, работает, курсы заполняются, отчёты приходят... НО !
Пока не смог определить с какой периодичностью - такое ощущение, что зависает экзешник и ничего не происходит! Ни сообщений, ни заполнения данных! Если службу остановить и запустить снова - всё нормуль, потом через несколько дней опять тишина!
Т.к. со службами дела не имел - сделал таймер в самом экзешнике, т.е. он периодически проверяет сколько времени и если сремя соответствует нужному интервалу - лезет на сайт! Но при такой схеме получается, что файл программы постояно висит в памяти и ХЗ что там с ним происходит!
Теперь собственно вопрос:

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

Код службы прилагаю

Код

implementation
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
StartEn: Boolean;
{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Kurs_Service.Controller(CtrlCode);
end;

function TKurs_Service.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TKurs_Service.ServiceStart(Sender: TService; var Started: Boolean);
var
  CmdStr: PChar;
begin
  if StartEn = False then
  begin
    CmdStr := PChar('C:\...111.exe'); // Определение командной строки  C:\windows\system32\calc.exe
    StartEn := False; // Запущено ли приложение
  // Без этого приложение не стартует =<
    FillChar(StartupInfo, Sizeof(StartupInfo), #0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_NORMAL; // Состояние окна запущенного приложения
  // <= Без этого приложение не стартует

  // Запускаем процесс
    StartEn := CreateProcess(nil,
    CmdStr, { указатель командной строки }
    nil, { указатель на процесс атрибутов безопасности }
    nil, { указатель на поток атрибутов безопасности }
    False, { флаг родительского обработчика }
    CREATE_NEW_CONSOLE or { флаг создания }
    NORMAL_PRIORITY_CLASS,
    nil, { указатель на новую среду процесса }
    nil, { указатель на имя текущей директории }
    StartupInfo, { указатель на STARTUPINFO }
    ProcessInfo); { указатель на PROCESS_INF }
    Started:=True;
  end;
end;

procedure TKurs_Service.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  if StartEn = True then
  begin
    ProcessInfo.hProcess := OpenProcess(PROCESS_TERMINATE, False,
      ProcessInfo.dwProcessId);
    if ProcessInfo.hProcess <> Null then
    begin
      TerminateProcess(ProcessInfo.hProcess, 0);
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(ProcessInfo.hProcess);
      StartEn := False;
      Stopped:=True;
    end;
  end;
end;


Заранее пасиб!
PM MAIL   Вверх
bems
Дата 13.11.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Если служба только для автозапуска в нужное время, то тебе не нужен икс. Тебе нужен стандартный виндовый планировщик заданий.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Litta
Дата 13.11.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 14.3.2006

Репутация: нет
Всего: 1



Ну понятно, что мона как-то извернуться, но хотелось бы оформить всё это в виде службы и разобраться как всё-таки это сделать smile
PM MAIL   Вверх
kami
Дата 14.11.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Litta @  13.11.2009,  16:54 Найти цитируемый пост)
 проверял время и если оно в нужном диапазоне, то запускл экзешник, а если время вне интервала, то гасил его ?

Гасить экзешник не стоит, лучше пусть он сам себя корректно завершает по выполнению нужной работы.

Все дальнейшее - только imho.
Если действительно нужно запускаться из службы и т.д. и т.п, то есть - четко следовать поставленному вопросу, я бы сделал так:

Код

TKurs_Service=class(TService)
  procedure ServiceExecute(Sender:TService); // должно быть назначено в design-time
  //
private
  FTimer:TTimer;
  procedure OnTimer(Sender:TObject);
public
  //
end;

//////

procedure TKurs_Service.ServiceExecute(Sender:TService);
begin
  FTimer:=TTimer.Create(nil);
  FTimer.Enabled:=False;
  FTimer.OnTimer:=OnTimer;
  FTimer.Interval:=......
  FTimer.Enabled:=True;

  While not Terminated do
    ServiceThread.ProcessRequests(True);

  FTimer.Free;
end;

procedure TKurs_Service.OnTimer(Sender:TObject);
begin
  if (Time>EncodeTime(16, 0, 0, 0)) and (Time<EncodeTime(18, 0, 0, 0)) then
    if <нужный процесс не запущен> then
      DoStartRBK_process;
end;


Как определить, запущен нужный процесс или нет - есть куча тем и примеров типа "как разрешить запуск программы в единственном экземпляре".

Это сообщение отредактировал(а) kami - 14.11.2009, 01:09
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.