VB.NET警告,CPU应用程序

VB.NET警告,CPU应用程序,vb.net,Vb.net,警告是:创建表单时出错。有关详细信息,请参见Exception.InnerException。错误是:无法加载计数器名称数据,因为从注册表读取了无效索引“” 我的代码是: Imports System Imports System.Management Imports System.Diagnostics Public Class Form1 Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) H

警告是:创建表单时出错。有关详细信息,请参见Exception.InnerException。错误是:无法加载计数器名称数据,因为从注册表读取了无效索引“”

我的代码是:

Imports System
Imports System.Management
Imports System.Diagnostics

Public Class Form1

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        Dim cpuLoad As Integer = CDec(PerformanceCounter1.NextValue.ToString())
        cpuLoad = 100 - cpuLoad
        Label1.Text = cpuLoad.ToString() & "%"

        On Error Resume Next
        ProgressBar1.Value = cpuLoad.ToString
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        Timer1.Start()

        Label2.Text = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor\0", "ProcessorNameString", Nothing)

        label3.text = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\CentralProcessor\0", "~MHz", Nothing) & " Mhz"
    End Sub

End Class
看一看。我发现了这一点,还有更多的例子表明您的问题是由一个或多个损坏的注册表项造成的。Pablissimo的回答提供了问题的解释,以及重建这些条目的相关步骤

单击开始,键入cmd,右键单击cmd.exe,然后选择运行方式 管理员在提示下,键入lodctr/r并按ENTER键


首先,在我的电脑上,你的cpu计数器给出了一个奇怪的值,“比实际值高2倍”

我使用的也是性能计数器,但其值与windows任务管理器中的值几乎相同

Dim CpuCounter As New PerformanceCounter()
Dim CpuResult As New Integer
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    With CpuCounter
        .CategoryName = "Processor"
        .CounterName = "% Processor Time"
        .InstanceName = "_Total"
    End With
    CpuResult = CpuCounter.NextValue
    CpuLabel.Text = CpuResult & "%"
    CpuBar.Value = CpuResult
End Sub
另一件事是……
获取ProcessorNameString和Mhz的代码正在我的计算机上运行

但是你也可以这样使用它

您需要导入Microsoft.Win32“当然,您已经有了”

如果这不起作用,您也可以使用WMI“ManagementObjectSearcher”来实现

您需要导入系统管理
并将参考系统管理添加到您的项目中。

然后,您可以在表单加载事件中使用此代码来获取相同的信息

    Dim cpuName As String
    Dim cpuFreq As String

Try
        Dim searcher As New ManagementObjectSearcher( _
            "root\CIMV2", _
            "SELECT * FROM Win32_Processor")

        For Each queryObj As ManagementObject In searcher.Get()

            cpuName = queryObj("Name")
            cpuFreq = queryObj("CurrentClockSpeed")

            Label2.Text = cpuName
            Label3.Text = cpuFreq & "MHz"
        Next
    Catch err As ManagementException
        MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    End Try

您应该首先启用并更正它显示给您的错误。。。。如果您告诉我们您用于
PerformanceCounter1
的参数,这会有所帮助。如果您使用cpuLoad=100-cpuLoad,那么它会显示空闲的数量。您可以删除“cpuLoad=100-cpuLoad”以获得良好的值。将cpuLoad设置为整数=CDec(PerformanceCounter1.NextValue.ToString())为什么使用.ToString?您还可以删除.ToString()
    Dim cpuName As String
    Dim cpuFreq As String

Try
        Dim searcher As New ManagementObjectSearcher( _
            "root\CIMV2", _
            "SELECT * FROM Win32_Processor")

        For Each queryObj As ManagementObject In searcher.Get()

            cpuName = queryObj("Name")
            cpuFreq = queryObj("CurrentClockSpeed")

            Label2.Text = cpuName
            Label3.Text = cpuFreq & "MHz"
        Next
    Catch err As ManagementException
        MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
    End Try