【问题标题】:Determine if process is done?确定过程是否完成?
【发布时间】:2016-03-11 19:17:10
【问题描述】:

背景

我正在思考如何从逻辑上判断一个过程是否完成。我目前有一个单独的程序,它生成一个文本文件,其标题栏名称为“信息”。当信息文本文件出现时,程序正在向它转储一大堆数据。这可能需要几秒钟或很多时间,具体取决于数据。基本上,我试图想出告诉我何时完成写入该文件的最佳方法。请记住,当我说文本文件时,它与记事本不同,因为它没有物理文件位置。它只是生成它的程序的一部分。

这是我目前所拥有的:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function

Dim proc As Integer
    Do Until proc <> 0
        proc = FindWindow(vbNullString, "Information")
    Loop

我在想我可以使用进程 ID 并确定它正在使用多少 CPU。如果它很高,则该进程当前正在使用中,如果低则它已完成。以上代码查找进程没有问题。

这是判断是否完成的好方法吗?如果是这样,我如何根据进程 ID 确定 CPU 使用率?可能有比我想象的更好的方法。

【问题讨论】:

  • 我注意到流程类有很多属性。也许其中之一会导致我的信息窗口?我确实查看并尝试遍历该进程的所有线程,但有时有很多,有时很少.. 取决于它需要多大的数据文件.. 所以不是很可靠

标签: vb.net process


【解决方案1】:
Process[] processes = Process.GetProcessesByName("ProcessName")
process = processes[0]
    process.WaitForExit()

但这会冻结程序,直到处理完成。 因此,正如 Ayush 所说,合并后台工作人员。

Private Sub StartButton_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                              Handles StartButton.Click

    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
                                     ByVal e As System.ComponentModel.DoWorkEventArgs) _
                                    Handles BackgroundWorker1.DoWork

    Process[] processes = Process.GetProcessesByName("ProcessName")
    process = processes[0]
    process.WaitForExit()

"你可以在这里放一些代码来表示它何时完成或低于方法。

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, _
          ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
          Handles BackgroundWorker1.RunWorkerCompleted

"这将在 bw 完成时被调用

End Sub

【讨论】:

  • 这行不通。我的程序没有开始这个过程。窗户本身也不会关闭。它只是完成了它正在做的事情。
  • 您混合了 C# 和 VB.NET 语法。正确的(和简短的版本)应该是:Dim process As Process = Process.GetProcessesByName("ProcessName")(0).
【解决方案2】:

您可以在 Visual Basic 中使用 BackgroundWorker 控件,它有一个名为“Run Worker Completed”的事件,该事件将在任务成功、失败或取消时引发。

【讨论】:

  • 看看这个website
  • 这并没有为他的问题提供答案,也没有向他展示如何使用 BGW。提供示例代码而不是链接或什么都不提供。
  • 我认为该网站会比我更彻底地教 Eric 如何使用控件,但是当我下次发布答案时,我会记住您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多