Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизTServiceApplication и формы Найти похожие ветки
← →
evgnib (2003-12-23 12:04) [0]сделал TServiceApplication.
Короче, для доступа к сервису есть иконка в трэе. Например хочу посмотреть информацию в frmWork (там listbox висит) и выбираю пункт для этого в меню (popup) для данного пункта вызов такой:
procedure TDMService.actFormExecute(Sender: TObject);
begin
frmWork.ShowModal;
end;
Беда вот в чем. Окно показывается, но при закрытии окна (крестик)
оно сразу не закрывается(!), а вот, если пошевелить, например, мышой за заголовок этого окна, то оно исчезает. Такое ощущение, что не обрабатываются сообщения сразу. Но есть невероятный факт, написал дома такой же сервис, но под WinXP, и он работает как положено.
в OnExecute:
~~~~~~~~~~~~~
ServiceTray.Enabled := True;
try
InitWorkForm; // frmWork := TfrmWork.Create(nil)
while not Terminated do
ServiceThread.ProcessRequests(False);
finally
DestroyWorkForm; // frmWork.Free;
end;
ps. Где собака порылась ?
← →
Digitman (2003-12-23 12:23) [1]
> Где собака порылась ?
в теле OnExecute() MainThreadId <> GetCurrentThreadId
здесь и "порылась"
← →
evgnib (2003-12-23 12:50) [2]а как исправить ситуацию ?
← →
Digitman (2003-12-23 12:58) [3]создавать форму и обращаться к форме ТОЛЬКО в контексте осн.код.потока сервисного приложения, т.е. обеспечить на момент создания/обращения условие MainThreadId = GetCurrentThreadId
в теле обработчиков OnStart(),OnStop(), OnExecute() это условие быть выполненным НЕ может
создание/уничтожение формы проще и безопасней всего осуществить в обработчиках событий TService.OnCreate()/OnDestroy()
там же - создание TrayIcon, его меню с соотв.обработчиками и пр.
← →
evgnib (2003-12-23 13:03) [4]спасибо, сейчас проверил - заработало ;)
← →
y-soft (2003-12-23 13:06) [5]Вообще, нехорошо интерактивно работать непосредственно с сервисом. Правильнее использовать для этого специальное приложение (отдельный EXE или апплет панели управления), работающее под учетной записью пользователя, а для связи - именованные каналы, сокеты, посылку пользовательских кодов через SCManager etc...
Многократно надежнее
← →
Digitman (2003-12-23 13:12) [6]
> y-soft
> Вообще, нехорошо
не думаю так.
что криминального в том, что в трее висит иконка быстрого виз.доступа к конфиг.параметрам сервиса ?
← →
y-soft (2003-12-23 13:21) [7]>Digitman © (23.12.03 13:12) [6]
Криминального ничего. Но увеличивается возможность вышибить сервис.
In my and Microsoft Corp. humble opinion :)
IMHO даже вывод MessageBox с флагом MB_SERVICE_NOTIFICATION из сервиса надо использовать лишь в самом крайнем случае...
В прочем - дело вкуса...
← →
Digitman (2003-12-23 13:32) [8]
> y-soft
> Но увеличивается возможность вышибить сервис
ну знаешь ли !)
с "кривыми" мозгами/руками любоесколь угодно надежное начинание и/или техн.решение можно загнать в разряд "глюков"
← →
y-soft (2003-12-23 13:47) [9]>Digitman © (23.12.03 13:32) [8]
А ты предусматриваешь ситуацию, когда панель задач перестает реагировать на посылку сообщений (из-за неправильной работы какого-нибудь третьего приложения)? Я с таким неоднократно сталкивался. В этом случае с большой вероятностью получишь в сервисе исключение при попытке послать NIF_ICON или NIF_TIP, не помогает даже заключение вызова в try...except :(
В случае же со специальным приложением сервис не пострадает.
Опять-таки чаще всего сервис конфигурируется при запуске, считывая настроечные параметры из реестра, и конфигурационные утилиты обычно просто меняют установки в реестре, а потом через SCManager перезапускают сервис...
В прочем еще раз повторюсь: это дело вкуса разработчика...
P.S. Ничего личного. С уважением, ...
← →
Digitman (2003-12-23 14:19) [10]
> y-soft
видишь ли, насколько мне стало понятно - в вопросе не идет речи о "командовании" сервисом посредством SCManager"а
просто есть некая форма, на которой , скажем, визуально отображается тек.инф-ция о прикладном состоянии сервиса, не более того
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c