Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
ВнизРабота с сервисами - помогите. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.043 c