提问人:level42 提问时间:8/13/2015 更新时间:8/14/2015 访问量:6308
持续监控进程是否正在运行
Constantly monitor if a process is running
问:
我有以下代码:
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 秒检查一次计时器一样简单,或者是否有更好、更有效的方法来解决这个问题。
在最终结果中,我希望有一个标签,根据进程写着“正在运行”或“未运行”,但我需要一些东西来不断观察进程。
答:
3赞
Shovers_
8/13/2015
#1
我做了类似的事情来监控我需要一直运行的 exe,并在它关闭时重新启动它。 我的是作为 Windows 服务运行的 - 这样它就会在 Windows 启动时启动,并且 id 永远不需要照顾它。
或者,您可以将其创建为控制台应用程序并将其放在启动文件夹中?
我有:
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......此外,计时器可能比让线程休眠更好。
评论
0赞
Altiano Gerung
7/31/2018
如何使 Windows 服务运行 GUI 程序?
0赞
Shovers_
8/2/2018
一个与用户交互的 GUI 程序?
0赞
Altiano Gerung
8/3/2018
是的,我需要确保我的交互式 GUI 程序始终正常运行
0赞
Shovers_
8/3/2018
还行。这可能很困难。可能是一个单独的问题。问题将围绕运行服务的帐户 - 如果其 SYSTEM 是 SYSTEM,则它启动的任何进程都将在 SYSTEM 上下文中运行,并且对系统的标准用户不可用
0赞
Shovers_
8/3/2018
事实上:stackoverflow.com/questions/4278373/......
1赞
Keith
8/13/2015
#2
根据我的经验,一个简单的计时器效果最好:
'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
您的里程可能会有所不同,但除非必要,否则我不喜欢处理单独的线程。
5赞
Idle_Mind
8/14/2015
#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,就像前面的 SO 问题一样。
评论