2015-08-13 99 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中所示。

相关问题