2009-01-13 3 views
1

У меня есть служба Windows (C#), которая генерирует несколько дочерних нативных процессов (C++).Нежно убить процесс

Я хотел бы периодически убивать эти процессы время от времени. (осторожно = пусть procs завершит свою работу до спуска).

Я попытался использовать процедуру SetConsoleCtrlHandler(), чтобы зарегистрировать дочерние процессы в событиях консоли и вызвать CloseMainWindow() из кода C#, чтобы поднять события закрытия консоли.

Это не сработало для меня. В основном потому, что дочерние процессы не являются консольными приложениями.

Кто-нибудь знает, какие другие методы могут быть использованы для выполнения этого требования?

+0

Fugees fan? лол. –

ответ

4

объекты ядра события приходят на ум: ваш «менеджер» поднимает событие назвал. Ваши дочерние процессы должны проверять состояние этого события по крайней мере один раз в то время (или иметь поток, который непрерывно проверяет его).

-1

У C# есть собственный способ доступа к работающим службам. Вы будете нуждаться в «System.ServiceProcess» пространства имен, а код должен выглядеть вроде этого:

ServiceController[] services = ServiceController.GetServices(); 
for(int i = 0; i < services.Length; i++) 
    { 
     if (services[i].DisplayName == "COM+ System Application") 
      { 
       if (sc.Status == ServiceControllerStatus.Running) 
      { 
      sc.Stop(); 
      } 
     if (sc.Status == ServiceControllerStatus.Stopped) 
      { 
      sc.Start(); 
      } 
      } 
    } 
    } 
+0

Мое понимание заключается в том, что дети-икры не являются собственными силами. Правильно? –

+0

@Serge - На самом деле он не говорит. Они описываются как «процессы» и описывают попытку закрыть их, как если бы они были внешними консольными приложениями, поэтому я сделал это предположение. –

2

Опубликовать сообщение дочерним процессам. Это может быть сообщение по собственному выбору, поэтому вы можете подобрать сообщение в дочерних процессах, а затем сделать то, что нужно сделать, см. WM_USER.

+0

Для этого требуется, чтобы у детей был насос сообщений. Консольные приложения обычно не имеют их. И так как у вас есть некоторые проблемы с получением/сеансом терминала из службы, я бы поставил на детей, что это консольные приложения. – MSalters

0

Изучите технику использования QueueUserAPC и исключения, описанные мной here. Вы можете найти это полезным.

Смежные вопросы