2015-08-13 2 views
1

У меня есть следующий код:Постоянно контролировать, если процесс запущен

Dim p() As Process 

Private Sub CheckIfRunning() 
    p = Process.GetProcessesByName("skype") 'Process name without the .exe 
    If p.Count > 0 Then 
     ' Process is running 
     MessageBox.Show("Yes, Skype is running") 
    Else 
     ' Process is not running 
     MessageBox.Show("No, Skype isn't running") 
    End If 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    CheckIfRunning() 
End Sub 

И это работает!

Но мне интересно, как я буду преобразовывать это в приложение мониторинга, чтобы постоянно проверять, запущены ли процессы. Это так же просто, как поставить таймер на таймер каждые 1 секунду, или есть лучший, более эффективный способ сделать это.

В конечном итоге я хотел бы иметь ярлык с надписью «Бег» или «Не работает» на основе процесса, но мне нужно что-то, чтобы постоянно наблюдать за процессом.

+0

Вы можете достичь этого несколькими способами. Я лично создаю рабочий поток, который будет работать до остановки и контролирует службу. Однако вы можете использовать различные решения этой проблемы. –

+0

Как вы относитесь к ответу @ keith ниже? Считаете ли вы, что существует ордер на то, чтобы поставить этот чек в свою собственную нить? Или задача такая крошечная, что она не стоит усилий? – level42

ответ

1

Я сделал что-то подобное этому, чтобы контролировать exe, что мне нужно работать все время, и перезапустить его, если он был вниз. Шахта работала как служба Windows - таким образом, она запускается, когда загружаются окна, а идентификатор никогда не должен заботиться о нем.

В качестве альтернативы вы могли бы просто создать его в качестве консольного приложения и поместить его в свою папку автозагрузки?

Я имел:

Sub Main() 

    Do 
     Check_server() 
     Dim t As New TimeSpan(0, 15, 0) 
     Threading.Thread.Sleep(t) 
    Loop 

End Sub 


Public Sub Check_server() 

    Dim current_pros() As Process = get_pros() 
    Dim found As Boolean = False 

    If Now.Hour < "22" Then 
     For Each pro In current_pros 
      If pro.ProcessName.ToLower = "Lorraine" Then 
       found = True 
       Exit For 
      Else 
       found = False 
      End If 
     Next 
     If found Then 
      Console.WriteLine("Server up") 
     Else 
      Console.WriteLine("Server down - restarting") 
      restart_server() 
     End If 
    End If 
End Sub 

Мое приложение «Сервер» был назван Lorraine ... Также таймер может быть лучше, чем практика, имеющий сон нить ..

1

Из моего опыта, простой работы таймера best:

'Timer interval set to 1-5 seconds... no remotely significant CPU hit 
Private Sub timerTest_Tick(sender As System.Object, e As System.EventArgs) Handles timerTest.Tick 
    Dim p() As Process = Process.GetProcessesByName("Skype") 
    lblStatus.Text = If(p.Length > 0, "Skype is running.", "Skype isn't running.") 
End Sub 

Ваш пробег может отличаться, но я не люблю обрабатывать отдельные потоки, если это необходимо.

3

Если вам нужно приложение, работающее все время, вам вообще не нужен таймер. Подпишитесь на событие Process.Exited(), чтобы получить уведомление о его закрытии. Например, с блокнотом:

Public Class Form1 

    Private P As Process 
    Private FileName As String = "C:\Windows\Notepad.exe" 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim ps() As Process = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(FileName)) 
     If ps.Length = 0 Then 
      P = Process.Start(FileName) 
      P.EnableRaisingEvents = True 
      AddHandler P.Exited, AddressOf P_Exited 
     Else 
      P = ps(0) 
      P.EnableRaisingEvents = True 
      AddHandler P.Exited, AddressOf P_Exited 
     End If 
    End Sub 

    Private Sub P_Exited(sender As Object, e As EventArgs) 
     Console.WriteLine("App Exited @ " & DateTime.Now) 
     Console.WriteLine("Restarting app: " & FileName) 
     P = Process.Start(FileName) 
     P.EnableRaisingEvents = True 
     AddHandler P.Exited, AddressOf P_Exited 
    End Sub 

End Class 

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

Если вы не хотите открывать его самостоятельно и вам нужно определить, когда он откроется, вы можете использовать WMI через ManagementEventWatcher, как в этом previous SO question.

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