2015-08-13 98 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秒將計時器進行檢查一樣簡單,還是有更好,更有效的方法來解決這個問題。

最後的結果是,我希望在標籤上標註「Running」或「Not Running」,但我需要一些東西來持續觀察過程。

+0

您可以通過多種方式實現此目的。我會親自產生一個運行直到停止並監視服務的工作線程。但是,您可以針對此問題使用各種解決方案。 –

+0

您對@ keith的回答有何看法?你認爲有把這個檢查放在它自己的線程中的權限嗎?或者這項任務很小,不值得付出努力? – level42

回答

1

我已經做了類似的事情來監控一個exe,我需要一直運行,並重新啓動它,如果它關閉。 Mine正在作爲Windows服務運行 - 這種方式會在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 

我的「服務器」應用程序被稱爲洛林......還有一個計時器不是讓線程睡眠,也許更好的做法..

1

從我的經驗,一個簡單的計時器作品最好:

'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 

這會保持它始終打開,假設你想打開它,如果它還沒有運行。

如果您不想自己打開它,並且需要檢測它何時打開,那麼您可以通過ManagementEventWatcher使用WMI,如在此previous SO question中所示。

相關問題