Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2007, 20:38   #1
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

Пишу службу... Есть ли там(в службах) что-то подобное Application.ProcessMessages? Просто как только вставляю в код безконечный цикл служба перестает реагировать на остановку/паузу, вообщем виснет. Помогите плиз!

Да, и ещё: как сделать, чтобы служба была постоянно запущена? То есть, если она ничего не делает, то при запуске пишет: Служба была запущена и затем остановлена. Некоторые службы автоматически останавливаются, если им нечего делать...
=LeonZone= вне форума Ответить с цитированием
Старый 01.01.2008, 14:05   #2
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

Неужели никто не пожет мне помочь? Пожалуйста! Очень надо
=LeonZone= вне форума Ответить с цитированием
Старый 02.01.2008, 02:13   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Во-первых :

application.ProcessMessages; В модуле Forms, добавь его в список.

Во-вторых :

делай так:

Код:
Var
Stop:boolean;
...

procedure TService1.ServiceCreate(Sender: TObject);
begin
Stop:=false;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
 while not Stop do
  begin
   sleep(100);
//   дополнительные функции - выполняются на протяжении работы сервиса
 end;
end;
...

{Где-то в коде, когда надо завершить сервис пишешь}
Stop:=true;
{Сервис закончит работу}
Все дополнительные функции легко можно реализовать через таймеры.
Будут вопросы говорите.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 02.01.2008, 06:49   #4
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию без комментариев

Код:
uses Forms;
Var
cn:byte;

procedure TService1.ServiceExecute(Sender: TService);
begin
//cn по умалчанию ноль вроде
 while 0<>0 do // ты ведь писал что у тя бесконечный цикл :)
  if cn=1 then exit else
   if cn=0 then
    begin
     application.ProcessMessages;
     //твой код
     //в коде присваиваем cn:=1 то выходим, cn:=2 (от двух и более) переходим в паузу, cn:=0 переход в основной код
    end 
    else
   begin
    application.ProcessMessages;
    //код при паузе
   end;
end;

Последний раз редактировалось Simply-Art; 02.01.2008 в 06:52. Причина: забыл application.ProcessMessages;
Simply-Art вне форума Ответить с цитированием
Старый 03.01.2008, 13:03   #5
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

2 Simply-Art & Air:
Спасибо, но я так пробовал! Проблема в том, что из-за этого бесконечного цикла служба НЕ выключается из управления службами, а надо... Если не использовать бесконечный цикл, то она запускается и сразу же закрывается. И как тогда быть?
=LeonZone= вне форума Ответить с цитированием
Старый 03.01.2008, 18:21   #6
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Вот подработал код.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TService1 = class(TService)
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;
  Stop:Boolean;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
  if CtrlCode = 1 then Stop:=true;
  if CtrlCode = 2 then Service1.DoPause;
  if CtrlCode = 3 then Service1.DoContinue;
end;

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

procedure TService1.ServiceCreate(Sender: TObject);
begin
Stop:=false;
// код, на момент создания потока, один раз при старте
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
while not Stop do
 begin
 sleep(300); // или 100 - эта задержка нужна, чтоб проц не грузить
 // код исполнения (рабочего цикла) при завершении =  ServiceDestroy
 end;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
Started:=true;
// код, при событии старра (всегда при старте)
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Stopped:=true;
// код, при событии остановки
end;

procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
Paused:=true;
if Stop then Service1.Status:=csStopped;
// код, при событии паузы (всегда при паузе, один раз за один переход)
end;

procedure TService1.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
Continued:=true;
// код, при событии продолжения (всегда при продолжении, один раз за один переход)
end;

procedure TService1.ServiceDestroy(Sender: TObject);
begin
// код, при завершении работы сервиса
end;

end.
Обрати внимание на "procedure ServiceController(CtrlCode: DWord); stdcall;"

Может это и наворочено, но пока это единственное решение.

Будут вопросы говорите.
Всё гениальное - просто!

Последний раз редактировалось Air; 03.01.2008 в 18:39. Причина: Модификация кода
Air вне форума Ответить с цитированием
Старый 07.01.2008, 13:49   #7
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

2 Air:
Спасибо тебе огромное!!! Всё отлично работает!
=LeonZone= вне форума Ответить с цитированием
Старый 07.01.2008, 13:52   #8
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

А как можно организовать общение программы со службой? Поясню:
надо, чтобы при запуске программы запускалась служба и ей(службе) передавались 2 строковых параметра...
=LeonZone= вне форума Ответить с цитированием
Старый 26.01.2008, 21:09   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Вопрос Консультация

Эта программа, всеголишь тест для проверки правильности кода. Мне надо знать как правильно использовать TServise.
Устанавливаю сервис батником, запускаю вручную в сервисах. Но прога неделает, то что надо( должна менять заголовок у блокнота ).
Посмотрите, что не так.

___________________________________ _______________________
Используйте для вложений не ZIP, а непрерывные RAR архивы. Экономит место и трафик.
Вложения
Тип файла: rar CaptionServis.rar (4.8 Кб, 31 просмотров)

Последний раз редактировалось Alter; 27.01.2008 в 01:16.
Alter вне форума Ответить с цитированием
Старый 26.01.2008, 21:58   #10
=LeonZone=
Форумчанин
 
Аватар для =LeonZone=
 
Регистрация: 15.08.2007
Сообщений: 118
По умолчанию

2 Alter:
Поставь свойство Interactive у Service в значение true или пропиши где-нить в коде Service1.Interactive:=true; и всё будет ок
=LeonZone= вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
application.ProcessMessages; UROKSAN Общие вопросы Delphi 2 10.04.2008 13:32
Аналог Application.ProcessMessages() Alter Общие вопросы Delphi 10 10.02.2008 00:58
Application.ProcessMessages KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.08.2007 23:38
Как остановить цикл без Application.ProcessMessages Alar Общие вопросы Delphi 0 29.10.2006 20:18