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

Вниз

Работа с сервисами - помогите.   Найти похожие ветки 

 
koha ©   (2007-10-01 07:36) [0]

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


 
Turbouser ©   (2007-10-01 07:44) [1]

Сервис с формами? Нельзя так делать. Не культурно.


 
Сергей М. ©   (2007-10-01 09:08) [2]


> Формы вызываются, но не закрываются виснут, не пойму вчем
> дело


Работа с формами в доп.потоках недопустима.


 
koha ©   (2007-10-01 10:07) [3]

А как правильно сделать?
- Но форма нужна, в принципе, я придумал такой метод: у формы OnClose на Form.hide, то форма не зависает а просто исчезает из вида так можно?
- Форма в принципе ничего не делает, только инфу показывает.


 
Сергей М. ©   (2007-10-01 10:13) [4]


> как правильно сделать?


Работать с формой в основном потоке.


> форма нужна, в принципе


> ничего не делает, только инфу показывает


Убирай форму из приложения-сервиса пока не поздно.

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


 
koha ©   (2007-10-01 14:33) [5]


> Сергей М. ©   (01.10.07 10:13) [4]


- К стати, а иконку в трее и менню можно?


 
Сергей М. ©   (2007-10-01 14:40) [6]

Можно, но не нужно, точно так же как и форму.

Еще раз - UI не является скол-либо оправданной задачей сервиса. Для реализации UI существуют обычные приложения и приложения-апплеты.


 
koha ©   (2007-10-01 17:20) [7]

Еще вопросик. Вот в сервисе у меня запускается еще один поток, собственно сервис управляет этим потоком дочерний поток при определенных условиях отправляет сообщения сервису через sendmessage(), а тот их обрабатывает своим обработчиком
type
 TSvcAntiAutoRuns = class(TService)
   //........
   procedure ThreadMessage(var Msg:TMessage);message WM_USER+1;
  //.........


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


 
Сергей М. ©   (2007-10-01 17:30) [8]


> дочерний поток при определенных условиях отправляет сообщения
> сервису через sendmessage()


Какое окно фигурирует в ка-ве получателя сообщения ?


 
Сергей М. ©   (2007-10-01 17:33) [9]


> в сервисе у меня запускается еще один поток


Сервис и так уже исполняется в собственном доп.потоке.
Чем вызвана необходимость создавать еще один доп.поток ?


 
Sairex ©   (2007-10-01 17:48) [10]

Ребят а если не трудно то и на мой вопросик ответьте плииз:
Не моглибы вы скинуть пример (рабочий) сервиса, а то сколько не бился не получалось.


 
Сергей М. ©   (2007-10-01 17:50) [11]


> не получалось


Что конкретно не получалось ?


 
koha ©   (2007-10-01 17:59) [12]


> Сергей М. ©   (01.10.07 17:30) [8]
> > дочерний поток при определенных условиях отправляет сообщения
> > сервису через sendmessage()Какое окно фигурирует в ка-
> ве получателя сообщения ?


Не окно, А Application.Handle....

procedure TSvcAntiAutoRuns.ServiceCreate(Sender: TObject);
begin
 AFThrd   := TAntiAutoRunThread.Create(Application.Handle,WM_USER+1);



> Сергей М. ©   (01.10.07 17:33) [9]
> > в сервисе у меня запускается еще один потокСервис и так
> уже исполняется в собственном доп.потоке.Чем вызвана необходимость
> создавать еще один доп.поток ?


1. Для выполнения параллельности задачи.
2. в дальнейшей работе сервиса остановка OnExecut означает завершение работы сервиса,  а приостановка дочернего потока не завершает работу

Например в onExecut проверяется состояния дочернего потока

while Not (AFThrd.Status = TS_STOPED) do begin //...

3. Планируется, что эта программа будет работать и на win9х но только без запуска сервиса как простая программа, а для совместимости главна работа программы вынесена в отдельный юнит и поток, который может работать и там и там.


 
koha ©   (2007-10-01 18:11) [13]


> Sairex ©   (01.10.07 17:48) [10]
> Ребят а если не трудно то и на мой вопросик ответьте плииз:
>  Не моглибы вы скинуть пример (рабочий) сервиса, а то сколько
> не бился не получалось.


А что не получалось?


 
tesseract ©   (2007-10-01 18:12) [14]


> Не окно, А Application.Handle...


А может PostThreadMessage ?  Да и для кого семафоры и mutex-ы придумали ? Через них контроль работы потоков не проще будет вести?


 
koha ©   (2007-10-01 18:19) [15]


> tesseract ©   (01.10.07 18:12) [14]
> > Не окно, А Application.Handle...А может PostThreadMessage
> ?  Да и для кого семафоры и mutex-ы придумали ? Через них
> контроль работы потоков не проще будет вести?


- Для меня это еще уууу... Я еще только учусь. лопачу dooks разный, но везде так скудно написано, особенно в русско-язычной литературе, а главное мало написано о правильном проектировании подобных прогррамм.


 
koha ©   (2007-10-01 18:24) [16]


> tesseract ©   (01.10.07 18:12) [14]
> > Не окно, А Application.Handle...А может PostThreadMessage
> ?  Да и для кого семафоры и mutex-ы придумали ? Через них
> контроль работы потоков не проще будет вести?


- Для меня это еще уууу... Я еще только учусь. лопачу dooks разный, но везде так скудно написано, особенно в русско-язычной литературе, а главное мало написано о правильном проектировании подобных прогррамм.


 
Сергей М. ©   (2007-10-02 10:45) [17]


> Не окно, А Application.Handle


Application.Handle - это хэндл главного окна приложения.


 
Сергей М. ©   (2007-10-02 10:48) [18]


> koha


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


 
koha ©   (2007-10-02 20:11) [19]


> Сергей М. ©   (02.10.07 10:48) [18]


В моей утилите только один экземпляр создается, а два одинаковых сервиса не запустятся.

Мне интересно как в таком случае работают некоторые антивирусы например AVP.EXE он же является и сервисом и имеет окна и взаимодействует с пользователем и ряд других антивирусов подобным образом устроены. По сути я  пытаюсь небольшую утилиту сделать которая будет удалять вредоносные программы. И хотел бы что бы она обладала такими способностями как проверка до входа юзера в систему и могла работать с интерфейсом пользователя и был один файл и работал как и на win9x так и NT платформе. Но похоже, что так не выйдет сервис сам по себе а интерфейс без входа пользователя существовать не межет, а сервис стартует раньше юзера. Вы правы на счет разделения их в корне интерфейс отдельно а сервис отдельно. Может ли это существовать все в одной программе? Но только запускаться будет по разному сперва как сервис, а когда юзер вошел как интерфейс другим процессом. Или все же делать лучше как советовали выше двумя разными модулями?

И еще вопрос как сервису узнать, что юзер вошел в свою учетную запись?


 
koha ©   (2007-10-02 21:08) [20]

> Сергей М. ©

Я думаю, что мог бы, приблизительно, так развести запуск в одном exe-шнике.

program FlashAntiAutostart;

uses
 SvcMgr,
 Windows,
 SysUtils,
 SvcInfo,
 Unit1 in "Unit1.pas" {SvcAntiAutoRuns: TService},
 Unit2 in "Unit2.pas" {FrmAbout},  
 Unit3 in "Unit3.pas" {FrmShowLog}
 //............
{$R *.RES}
Var //...
begin
//..........................
 if WinNT = true then begin //
      // Function SvcStartServise() from SvcInfo.pas
  if Function SvcStartServise("SvcAntiAutoRuns") then begin //если сервис уже запущен
     Application.Initialize;                                 //то запускаем как простое приложение
     Application.CreateForm(TFrmAbout, FrmAbout);
     Application.CreateForm(TFrmShowLog, FrmShowLog);
   end
   else begin
     if not Application.DelayInitialize or Application.Installing then // это собственно для старта самого сервиса
       Application.Initialize;
     Application.CreateForm(TSvcAntiAutoRuns, SvcAntiAutoRuns);
   end  
 end
 else begin // это значит в режиме win9x
   Application.Initialize;
   Application.CreateForm(TFrmAbout, FrmAbout);
   Application.CreateForm(TFrmShowLog, FrmShowLog);
 end
 Application.Run;
//............................
end.


- ??


 
Johnmen ©   (2007-10-02 22:32) [21]


> Сергей М. ©   (01.10.07 14:40) [6]
> Еще раз - UI не является скол-либо оправданной задачей сервиса.

А чем он является?
И какие есть объективные причины для других категоричных высказываний в данной ветке?


 
Сергей М. ©   (2007-10-03 08:18) [22]


> В моей утилите только один экземпляр создается, а два одинаковых
> сервиса не запустятся


Я не про это.

Я про то что одно и то же сервис-приложение, будучи стартованным, в ходе работы вполне может создавать более чем один сервис.

См. File -> New -> Other.. -> Service


> Johnmen ©   (02.10.07 22:32) [21]



> чем он является?


Организация UI - задача "обычных" приложений (в т.ч. апплетов, консольных).
А "запуздыривать иконки" можно конечно научить и драйвер)


> для других категоричных высказываний


Это каких ?)


 
koha ©   (2007-10-03 13:42) [23]


> Сергей М. ©   (03.10.07 08:18) [22]


Идею передавать сообщения Application.Handle сервису я уже передалываю, согласен, что протупил. Но все же некоторые программы работают так, уже выше упоминал (koha ©   (02.10.07 20:11) [19]). Они - то, что отступили от принципов или извращенцы? Или это нестандартное применение как новое направление? Ведь в свою очеред нетипичным было применение скинов все старались держаться в стороне, но winamp сделал "революцию".
Может быть у меня не правильное понятие о сути работы этих программ?


 
Сергей М. ©   (2007-10-03 13:52) [24]


> koha ©   (03.10.07 13:42) [23]


Ты, кстати, автовладелец ?

Понимаешь ли, двигатель существует сам по себе.
Его задача - двигать твой драндулет.

А вот контроль за работой двигателя - это задача разработчиков бортовых приборов контроля и собственно водилы, но никак не двигателя)

Та к вот сервис - это тот самый двигатель, а внешнее приложение - это те самые бортовые приборы контроля.


 
koha ©   (2007-10-03 14:00) [25]


> Сергей М. ©   (03.10.07 13:52) [24]


- идея с двигателями понятна, но вот идея с трансформерами не понятна.


 
Сергей М. ©   (2007-10-03 14:11) [26]


> идея с трансформерами не понятна


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

Либо то либо другое, о чем соббсно ты и упомянул в [20] и против чего я собссно и не имею возражений.

Но вот когда один и тот же экземпляр твоего приложения, рожденный сервис-менеджером в ипостаси "двигателя", пытается при этом примерить на себя ипостась "приборной панели" (см. то самое "запуздыривание иконки") - вот это ненормально)


 
Johnmen ©   (2007-10-03 17:24) [27]


> Сергей М. ©   (03.10.07 08:18) [22]
> Организация UI - задача "обычных" приложений (в т.ч. апплетов, консольных).

В какой книге/на каком ресурсе про это написано?


 
Сергей М. ©   (2007-10-03 17:31) [28]


> Johnmen ©   (03.10.07 17:24) [27]


Цитата из

http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vbcon/html/vbconintroductiontontserviceapplications.asp

Знакомство со служебными приложениями Windows

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


Вопросы еще имеются ?)

Разумеется, это не жупел, но рекомендованное мелкомягкими концептуальное назначение служб)


 
Johnmen ©   (2007-10-03 17:39) [29]


> Сергей М. ©   (03.10.07 17:31) [28]

Здесь ничего не говорится, что службы НЕ ДОЛЖНЫ / НЕ МОГУТ иметь UI, как можно было понять по твоим категорическим высказываниям.
И я бы сказал не "не жупел", а "не догма".


 
Leonid Troyanovsky ©   (2007-10-03 17:53) [30]


> Johnmen ©   (03.10.07 17:39) [29]

> Здесь ничего не говорится, что службы НЕ ДОЛЖНЫ / НЕ МОГУТ
> иметь UI

Помиритесь на GUI, т.е., службы могут быть как GUI так и нет.

Ну, а интерактивное взаимодействие с десктопом юзера вполне,
IMHO, достойно категоричности, особенно в этой эхе.

--
Regards, LVT.


 
DVM ©   (2007-10-03 21:56) [31]


> Johnmen ©

Можно и на корову седло надеть и на скачках на ней выступать.
Скажите честно, Вы сами будете так делать (окна в службах)?
Вы, по-моему спорите только из-за того, что Вам не понравилось категоричное высказывание Сергея, но не более того. А Сергей ведь прав.
И здесь не нужно для доказательства приводить какие-то там выдержки из MSDN. Просто здравый смысл говорит о том, что окна в службах - это явно посторонняяя и чуждая назначению службы вещь.

Простой пример.

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

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


 
Johnmen ©   (2007-10-03 22:59) [32]


> DVM ©   (03.10.07 21:56) [31]
> Скажите честно, Вы сами будете так делать (окна в службах)?

Не только буду, но и был и есть. И никаких проблем не испытываю. А почему? А потому, что догматов не читал :)

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

Наверное, Гейтс думает по-другому? Иначе, зачем же ему GUI, например, для MSSQL Server, запущенному, как служба? Отрезал бы, и все дела...
Или же для IBServer (тоже, как служба)?


 
DVM ©   (2007-10-03 23:16) [33]


> Или же для IBServer (тоже, как служба)?

И где у него окна?


 
Anatoly Podgoretsky ©   (2007-10-03 23:23) [34]

> DVM  (03.10.2007 23:16:33)  [33]

У SQL тоже нет, все управление через внешние клиентские программы.


 
Сергей М. ©   (2007-10-04 08:22) [35]


> зачем же ему GUI, например, для MSSQL Server, запущенному,
>  как служба?


Иконку в трей запуздыривает не MSSQL-сервис, а сервис-менеджер (sqlmanagr.exe) - обычное гуёвое приложение.


 
Leonid Troyanovsky ©   (2007-10-04 09:09) [36]


> DVM ©   (03.10.07 21:56) [31]

> окна в службах - это явно посторонняяя и чуждая назначению
> службы вещь.

Окна в службах - нормальная вещь, многие сервисы являются
GUI приложениями.

А вот взамодействие юзера с этими окнами - извращение,
как со стороны здравого смысла, так и со стороны msdn.

--
Regards, LVT.


 
DVM ©   (2007-10-04 11:02) [37]


> Leonid Troyanovsky ©   (04.10.07 09:09) [36]


> Окна в службах - нормальная вещь, многие сервисы являются
> GUI приложениями.

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

Но зачем создавать GUI приложение с окнами и запускать его как сервис, если никто этот GUI никогда не увидит? Не понимаю. Только, если изначально приложение не было сервисом, а потом его решили таковым сделать.

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


 
DVM ©   (2007-10-04 11:04) [38]

Кстати, тот же SQLServer.exe вообще не импортирует функцию CreateWindow(Ex) и в запущенном состоянии потребляет 0 объектов USER, что наводит на мысль о том, что вряд ли в его коде создается хоть одно окно вообще.



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

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

Наверх




Память: 0.58 MB
Время: 0.023 c
2-1191351217
Pacific
2007-10-02 22:53
2007.10.28
нажатие


15-1190873947
F@T@L_Err0r
2007-09-27 10:19
2007.10.28
Ctrl+Alt+Del


2-1191740508
hinst
2007-10-07 11:01
2007.10.28
чтобы форма появлялась градиентно


2-1191588575
olevacho_
2007-10-05 16:49
2007.10.28
Представление данных


2-1191862496
DeadLord
2007-10-08 20:54
2007.10.28
ламерский вопрос:(