Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

TServiceApplication - организация интерфейса   Найти похожие ветки 

 
andrey__   (2004-05-07 10:31) [0]

Была программа с таймером (работающим постоянно) и  с интерфейсом в виде формы с помощью которого можно было остановить/запустить работу таймера, поменять параметры его работы ну и еще кое что. Потом возникла необходимость переписать программу как службу. Основную работу которую делает таймер я реализовал как службу (TServiceApplication )  но теперь стоит задача сделать интерфейс к этой службе. Кто может подсказать как это сделать - прошу ответить.
Спасибо.


 
Семен Сорокин ©   (2004-05-07 10:37) [1]

andrey__   (07.05.04 10:31)  
Да таким же образом, я делал так:
1. При установки сервиса - автоматом модально показывал форму с настройками (там событие есть OnInstall или похожее).
2. Либо при запуске с ключом (например /Setup) тоже показываешь форму.


 
andrey__   (2004-05-14 11:43) [2]

>Семен Сорокин ©   (07.05.04 10:37) [1]
>Да таким же образом, я делал так:
>1. При установки сервиса - автоматом модально показывал форму с >настройками (там событие есть OnInstall или похожее).

Если Ты имеешь в виду событие OnCreate, то Я сделал форму и показываю ее в этом событии. Инсталлирую (делаю вход в систему под LocalSystem, помечаю "разрешить взаимодействовать с рабочим столом"), запускаю на своей машине (Windows 2000 Professional) все нормально - показывается форма и одновременно работает служба.
Пытаюсь инсталлировать на другой машине (Windows 2000 Server) - инсталлируется нормально, но когда запускаю, то форма не отображается, а служба работает нормально.
Подскажите, как сделать, чтобы отображалась форма на Windows 2000 Server.


 
Семен Сорокин ©   (2004-05-14 11:58) [3]

andrey__   (14.05.04 11:43) [2]
трудно сказать в чем проблема.
не пробовал пройтись отладчиком? приведи код отображения формы.


 
andrey__   (2004-05-14 12:11) [4]

>приведи код отображения формы.

код файла проекта:
program UchetServServiec;
uses
 SvcMgr,
 unServService in "unServService.pas" {ServService: TService},
 Unit1 in "Unit1.pas",
 WorkSenior in "WorkSenior.pas",
 Workbackground in "Workbackground.pas",
 WorkCrea30min in "WorkCrea30min.pas",
 CreateBackup in "CreateBackup.pas",
 Un_Work9_SutTab in "Un_Work9_SutTab.pas",
 unInterfase in "unInterfase.pas" {InterfaseForm};
{$R *.RES}
begin
 Application.Initialize;
 Application.CreateForm(TServService, ServService);
 Application.Run;
end.


код отображения формы:
procedure TServService.ServiceCreate(Sender: TObject);
begin
  Application.CreateForm(TInterfaseForm, InterfaseForm);
  InterfaseForm.Show;
end;


 
Digitman ©   (2004-05-14 12:23) [5]


> то форма не отображается, а служба работает нормально


у тебя в коде речь идет как минимум о 2-х формах - TServService и TInterfaseForm... какая из них не отображается ? TServService ? а смысл вообще каков в ней заложен ? ведь сервис-приложение, будучи запущенным, может контролировать работу более чем одного сервиса !


 
andrey__   (2004-05-14 12:40) [6]

>Digitman ©   (14.05.04 12:23) [5]

TServService - это сервис, а TInterfaseForm - форма с помощию которой я хочу управлять работой сервиса (пауза, продолжение, стоп) и менять параметры ее работы.


 
Digitman ©   (2004-05-14 12:50) [7]

т.е. при старте сервис-приложения ты не видишь никаких визуальных проявлений создания формы TInterfaseForm ? я правильно понял ?


 
Петров Денис ©   (2004-05-14 13:12) [8]

IMHO, писать интерактивные сервисы - во-первых, дурной тон, во-вторых, достаточно нудно: тебе еще предстоит не только создать вывести форму, а вывести ее на нужный десктоп нужной оконной станции. Соответственно, определить, есть ли он вообще на текущий момент. оно тебе надо?

Хочешь настраивать сервис налету - предусмотри какой-нибудь интерфейс взаимодействия с сервисом, например, через проецируемые файлы, сокеты, вариантов много. Создай, к примеру, cpl и настрайвай через него.


 
Armen   (2004-05-14 13:37) [9]

program Project2;
                                                                               
uses
 SvcMgr,
 Forms,
 SysUtils,
 Unit1 in "Unit1.pas" {Service1: TService},
 Unit2 in "Unit2.pas" {Form2};

{$R *.RES}
                                                                               

begin
 if FindCMDLineSwith(..."/configure"...Параметры не помню, под рукой нету Delphi) then
 begin
   SvcMgr.Application.Initialize;
   SvcMgr.Application.CreateForm(TService1, Service1);
   SvcMgr.Application.Run;
 end else
 begin
   Forms.Application.Initialize;
   Forms.Application.CreateForm(TForm2, Form2);
   Forms.Application.Run;
 end;
end.


 
andrey__   (2004-05-14 13:40) [10]

>Digitman ©   (14.05.04 12:50) [7]
>т.е. при старте сервис-приложения ты не видишь никаких >визуальных проявлений создания формы TInterfaseForm ? я >правильно понял ?

Да при старте на машине с Windows 2000 Server формы нет. Но я забыл сказать, что при инсталяции форма появляется вместе с сообщением "serviec installed successfully" и после того как я жму ОК исчезает (тоже самое и в Windows 2000 Professional, но там при запуске службы она отображается).


 
Digitman ©   (2004-05-14 13:45) [11]


> andrey__


ну при инсталляции - это понятно .. еще бы она не отображалась  ..

а вот старт сервиса под управлением Винтукей-Сервера вполне может происходить в контексте иного дисктопа, поэтому и окно формы не отображается на текущем дисктопе


 
Armen   (2004-05-14 13:49) [12]

Armen   (14.05.04 13:37) [9]
Проверено 100% работает, и не надо делать сервис интерактивной.
Только после этого Delphi IDE уже не в силах справиться с файлом проекта, и придется там все писать руками.


 
Петров Денис ©   (2004-05-14 13:51) [13]

> andrey__   (14.05.04 11:43) [2]
> делаю вход в систему под LocalSystem

Уважаемый, простейшая ситуация: сервис стартует автоматически? Скорее всего. Когда происходит автостарт сервиса? Естественно, до входа пользователя в систему. Пока ни один из пользователей не вошел в систему, на какой десктоп будет выведена твоя форма?

Ты же говоришь ей создаваться автоматически, так определи, для начала, оконную станцию и рабочий стол, чтобы VCL создала тебе форму.

Кроме того, учти, что у SvcMgr.Application и Forms.Application - свои циклы выборки сообщений.

Для иллюстрации неработоспособности твое кода в принципе, а не только под Win2k Server, предлагаю произвести эксперимент: перезагрузись, получи свое сообщение об ошибке и сделай либо так, как предлагает Armen   (14.05.04 13:37) [9], либо напиши по-человечески интерактивный сервис, либо настрайвай сервис из отдельного приложения.


 
Digitman ©   (2004-05-14 13:57) [14]


> andrey__


Конечно же, интеракт.сервис - это большая крайность ..

Поэтому прислушайся к
> Петров Денис ©   (14.05.04 13:12) [8]
и реализуй интерак.управление сервисом любыми другими средствами, например, те же самые  GUI-app/CPL-app + MMF/Pipes/ThreadMessages


 
Digitman ©   (2004-05-14 14:01) [15]


> > andrey


есть и еще один (правда весьма изощренный) способ обмена инф-цией с сервисом - использование сервисом и управляющим им приложением единой ДЛЛ с расшаренной в ней секцией данных


 
Игорь Шевченко ©   (2004-05-14 14:22) [16]

Digitman ©   (14.05.04 14:01)


> единой ДЛЛ с расшаренной в ней секцией данных


Сергей, а вопрос такой - ты готовых инструментов/версий Delphi не встречал, которые позволяют сделать расшаренную секцию данных в DLL?


 
Digitman ©   (2004-05-14 14:37) [17]


> Игорь Шевченко ©   (14.05.04 14:22) [16]


Игорь. нет, не встречал ... попросту потому что не интересовался ... но наверняка таковые (прикладные инструменты. но не версии делфи) имеются в природе ...

Но среди Индейских компонентов, думаю что ты в курсе, есть готовые соотв.утилитки, "одетые" в компонентную оболочку ... невелика функциональность их, но дело они делают ...


 
andrey__   (2004-05-14 15:46) [18]

>Armen   (14.05.04 13:37) [9]

если можно то в двух словах объясни как выведется форма. Может что-то я не так написал

begin
if FindCmdLineSwitch("INSTALL",[],false) then
begin
  SvcMgr.Application.Initialize;
  SvcMgr.Application.CreateForm(TService1, Service1);
  SvcMgr.Application.Run;
end else
begin
  Forms.Application.Initialize;
  Forms.Application.CreateForm(TForm2, Form2);
  Forms.Application.Run;
end;
end.


Инсталировать получается но что дальше - служба не запускается.


 
andrey__   (2004-05-14 16:02) [19]

>Петров Денис ©   (14.05.04 13:51) [13]
>Для иллюстрации неработоспособности твое кода в принципе, а не >только под Win2k Server, предлагаю произвести эксперимент: >перезагрузись, получи свое сообщение об ошибке

Попытался сделал перегруз, после того как машина перегрузилась  сервис начал работать (узнал по звуковому сигналу который специально поставил), зашёл в систему форма есть и функционирует. Завершил сеанс - служба работает (по звуковому сигналу), вошёл под другим пользователем - форма видна. Но только это все в Windows 2000 Professional.


 
Петров Денис ©   (2004-05-14 16:16) [20]

> andrey__   (14.05.04 16:02) [19]

Сколько энергии, направленной в русло саморазрушения...

Говорят тебе, не пиши интерактивные сервисы без крайней необходимости. Хрен с ним, с моим мнением, у меня нет феньки мастера в анкете. Ну прислушайся ты хотя бы к Digitman"у, он ведь не зря говорит!

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

Но нет, вместо того, чтобы решать задачу изменения параметров сервиса, ты решаешь проблему вывода формы под Win2k Server. Зачем?


 
Digitman ©   (2004-05-14 16:24) [21]


> Петров Денис ©   (14.05.04 16:16) [20]


нашего (вашего ?) "сервисного" полку прибыло, однако ... в лице разбирающихся спецов ... крайне приятно ...


 
Петров Денис ©   (2004-05-14 16:28) [22]

:)


 
andrey__   (2004-05-14 17:18) [23]

andrey__   (14.05.04 15:46) [18]     ???????


 
Петров Денис ©   (2004-05-14 17:26) [24]

> andrey__   (14.05.04 15:46) [18]

Если уж так неймется, внимательно посмотри на
if FindCmdLineSwitch("INSTALL",[],false),
на реализацию класса TService, и на свойства своего сервиса в оснастке MMC "Службы".

И процесс просмотра рекомендую сопроводить чтением книги "Программирование серверных приложений для MS Windows 2000". Сразу все станет кристалльно ясно.


 
Armen   (2004-05-14 17:31) [25]

>andrey__   (14.05.04 15:46) [18]
FindCmdLineSwitch("INSTALL",[],false) "INSTALL" замени на "configure", "setup" ... false на true.

Вообщем, если запускаем с ключами /setup, /configure, то запускается Forms.Application, если /install, /uninstall, /silent или вообще без ключа, то SvcMgr.Application.

Удачи.


 
andrey__   (2004-05-14 17:51) [26]

спасибо всем. если  не затруднит можете выслать мне свой пример (если есть).


 
Armen   (2004-05-14 17:55) [27]

Должно быть так

begin
if not FindCmdLineSwitch("setup", [], true) then
begin
 SvcMgr.Application.Initialize;
 SvcMgr.Application.CreateForm(TService1, Service1);
 SvcMgr.Application.Run;
end else
begin
 Forms.Application.Initialize;
 Forms.Application.CreateForm(TForm2, Form2);
 Forms.Application.Run;
end;
end.


 
sniknik ©   (2004-05-14 18:56) [28]

есть такая прога в дельфях scktsrvr, прога может быть и приложением и сервисом, нтерактивным сервисом, есть исходники ....

затрудняюсь сказать как она себя поведет в терминале, но судя по функционалу будет отображатся только на десктопе сервера (другого ей не нужно, а значит скорее всего не реализовано).



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

Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.067 c
14-1084467296
romychk
2004-05-13 20:54
2004.05.30
Не могу настроить TCP IP


3-1084174470
Satyros
2004-05-10 11:34
2004.05.30
Проблема с подключением к DB2


11-1074451034
Ego_Brain
2004-01-18 21:37
2004.05.30
МультиФорм в МЦК


4-1081757189
Piero
2004-04-12 12:06
2004.05.30
Есть ли стандартная функция поиска файла.


3-1083336426
TankMan
2004-04-30 18:47
2004.05.30
Посоветуйте компонент...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский