有没有什么办法了WinRT的应用以衡量自己的CPU使用率?(Is there any way for

2019-10-17 05:33发布

我用不同的方式做游戏显卡在WinRT的实验,并且它会是不错的,如果我的测试应用程序可以测量并显示自己的CPU使用率,这样我就可以比较不同的方法(ItemsControl的与周围的手动运动图像对比的DirectX )。

在完全成熟的.NET,我可以读Process.TotalProcessorTime在时间上两个已知点,然后取增量处理器时间由增量时间划分(调整如果需要的处理器的数量)。 如果应用程序在完全信任的运行,我甚至可以找到Process实例dwm.exe (因为它把屏幕上的图形用户界面的所有繁重的任务),并添加到我的CPU时间。 这是我参加了我的WinForms和WPF版本的做法游戏图形测试套件 。

但在WinRT中的类的System.Diagnostics.Process不存在。 如果有一个备用API,我不知道到哪里寻找它。

我可以打开任务管理器,并设置它留在上面,只是留意它作为我的应用程序运行。 这是不太理想的,因为(一)它涵盖了我的窗口的一部分,因此可能歪斜的业绩略; 和(b)我不能做任何我自己成果的聚集或记录(如“这里是CPU的平均利用率超过十秒钟的跨度”)。 所以,如果有一些方法我能得到我的CPU使用编程方式,我会更喜欢,只是因为增加了灵活性它给了我。

有没有什么办法了WinRT的应用程序,以确定自己的CPU使用率?

Answer 1:

我不知道任何“认可”的API从Windows商店应用中获取此信息。

但是,如果你只是想这样做的一个测试应用程序,你可以用“未经批准”的API。 如果您使用的是不批准的API,你的程序将无法通过WACK认证,并不能上传到商店,但是出于测试本地没关系。 请注意,有没有保证,当你调用的API未经批准,所以其行为正式不确定,但是很多功能,做工精细 - 至少在当前版本中。

我演示了如何调用AllocConsole的文章中,我今年夏天早些时候写道,在“在Metro风格应用程序的printf调试” 。 你可以从C#类似的东西,或者使用P / Invoke来调用本机的功能,也可以通过写C ++ Windows运行时组件,可以从C#调用。

对于你的情况,我建议你打电话GetCurrentProcess让手柄到当前进程,并把它传递给GetProcessTimes来获取用户和内核时间。 我跑了一个简短的测试,并得到了这种方法合理的妆效。

下面是一个使用P / Invoke来拨打电话一个完整的C#类:

static class DebugProcessTimes
{
    [StructLayout(LayoutKind.Sequential)]
    private struct FileTime
    {
        public UInt32 Low;
        public UInt32 High;
    }

    private static UInt64 ToUInt64(FileTime time)
    {
        return ((UInt64)time.High << 32) + time.Low;
    }

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetProcessTimes(
        IntPtr hProcess,
        out FileTime lpCreationTime,
        out FileTime lpExitTime,
        out FileTime lpKernelTime,
        out FileTime lpUserTime);

    public struct ProcessTimes
    {
        public UInt64 CreationTime;
        public UInt64 ExitTime;
        public UInt64 KernelTime;
        public UInt64 UserTime;
    }

    public static ProcessTimes GetProcessTimes()
    {
        FileTime creation, exit, kernel, user;

        if (!GetProcessTimes(GetCurrentProcess(),
                out creation, out exit, out kernel, out user))
            throw new Exception(":'(");

        return new ProcessTimes
        {
            CreationTime = ToUInt64(creation),
            ExitTime     = ToUInt64(exit),
            KernelTime   = ToUInt64(kernel),
            UserTime     = ToUInt64(user)
        };
    }
}

用法:

var times = DebugProcessTimes.GetProcessTimes();


Answer 2:

不幸的是,没有在WinRT中的的System.Diagnostics.Process类的等价物,至少目前没有( 缺少参照的System.Diagnostics.Process并在Win8的Metro风格的应用程序访问其他进程 )。 一些原生API暴露的WinRT(见我怎样才能在WinRT的逻辑CPU的数量?为例),但我不能找到一个列表。



文章来源: Is there any way for a WinRT app to measure its own CPU usage?