python在windows系统中获取进程的cpu占用率

 python获取进程cpu的占有率:

     一种方法是利用windows的wmi接口。由于任务比较紧,另外不知道怎么地在本机上测试总是没有成功。可能是python调用的借口有问题。

索性弃之不用,用第二种方法。

    第二种方法是给python写扩展,此处用到的是c++,采用boost python。毕竟自己搞windows编程的时间比较长,用api什么的比较顺手。

至于怎么写扩展,我会在下一篇文章中提到。网上也有很多教程。

   1、先写windows的dll代码如下:

 
  
1 #include " stdafx.h "
2 #include " windows.h "
3 #include < boost / python / module.hpp >
4 #include < boost / python / def.hpp >
5 #include < shellapi.h >
6 #include < psapi.h >
7
8   #pragma comment(lib, "psapi.lib")
9
10   // 定义获取CPU负载的结构体
11 typedef struct _THREAD_INFO
12 {
13 LARGE_INTEGER CreateTime;
14 DWORD dwUnknown1;
15 DWORD dwStartAddress;
16 DWORD StartEIP;
17 DWORD dwOwnerPID;
18 DWORD dwThreadId;
19 DWORD dwCurrentPriority;
20 DWORD dwBasePriority;
21 DWORD dwContextSwitches;
22 DWORD Unknown;
23 DWORD WaitReason;
24
25 }THREADINFO, * PTHREADINFO;
26
27 typedef struct _UNICODE_STRING
28 {
29 USHORT Length;
30 USHORT MaxLength;
31 PWSTR Buffer;
32 } UNICODE_STRING;
33
34 typedef struct _PROCESS_INFO
35 {
36 DWORD dwOffset;
37 DWORD dwThreadsCount;
38 DWORD dwUnused1[ 6 ];
39 LARGE_INTEGER CreateTime;
40 LARGE_INTEGER UserTime;
41 LARGE_INTEGER KernelTime;
42 UNICODE_STRING ProcessName;
43
44 DWORD dwBasePriority;
45 DWORD dwProcessID;
46 DWORD dwParentProcessId;
47 DWORD dwHandleCount;
48 DWORD dwUnused3[ 2 ];
49
50 DWORD dwVirtualBytesPeak;
51 DWORD dwVirtualBytes;
52 ULONG dwPageFaults;
53 DWORD dwWorkingSetPeak;
54 DWORD dwWorkingSet;
55 DWORD dwQuotaPeakPagedPoolUsage;
56 DWORD dwQuotaPagedPoolUsage;
57 DWORD dwQuotaPeakNonPagedPoolUsage;
58 DWORD dwQuotaNonPagedPoolUsage;
59 DWORD dwPageFileUsage;
60 DWORD dwPageFileUsagePeak;
61
62 DWORD dCommitCharge;
63 THREADINFO ThreadSysInfo[ 1 ];
64
65 } PROCESSINFO, * PPROCESSINFO;
66
67
68 #ifdef _MANAGED
69 #pragma managed(push, off)
70 #endif
71
72 BOOL APIENTRY DllMain( HMODULE hModule,
73 DWORD ul_reason_for_call,
74 LPVOID lpReserved
75 )
76 {
77 return TRUE;
78 }
79 int GetProessCPU(DWORD dwProcessId)
80 {
81 int nCpuUsage = 0 ;
82 DWORD dwInfoSize = 0x20000 ;
83 PPROCESSINFO pProcessInfo;
84 DWORD dwWorkingSet;
85 long ( __stdcall * NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD);
86
87 static __int64 nLastTotalProcessCPUUsage = 0 ;
88 static __int64 nLastCurrentProcessCPUUsage = 0 ;
89 __int64 nTotalProcessCPUUsage = 0 ;
90 __int64 nCurrentProcessCPUUsage = 0 ;
91
92 //
93 PVOID pProcInfo = (PVOID)( new char [dwInfoSize]);
94 NtQuerySystemInformation = ( long (__stdcall * )(DWORD,PVOID,DWORD,DWORD))GetProcAddress(GetModuleHandle(L " ntdll.dll " ), " NtQuerySystemInformation " );
95 NtQuerySystemInformation( 5 , pProcInfo, dwInfoSize, 0 );
96 pProcessInfo = (PPROCESSINFO)pProcInfo;
97 do
98 {
99 nTotalProcessCPUUsage += (__int64)pProcessInfo -> KernelTime.QuadPart + (__int64)pProcessInfo -> UserTime.QuadPart;
100 if (pProcessInfo -> dwProcessID == dwProcessId)
101 {
102 dwWorkingSet = pProcessInfo -> dwWorkingSet;
103 nCurrentProcessCPUUsage += (__int64)pProcessInfo -> KernelTime.QuadPart + (__int64)pProcessInfo -> UserTime.QuadPart;
104 }
105 if (pProcessInfo -> dwOffset == 0 )
106 {
107 break ;
108 }
109 pProcessInfo = (PPROCESSINFO)(( char * )pProcessInfo + pProcessInfo -> dwOffset);
110 } while ( true );
111
112 __int64 nTotalDelta = nTotalProcessCPUUsage - nLastTotalProcessCPUUsage;
113 __int64 nCurrentDelta = nCurrentProcessCPUUsage - nLastCurrentProcessCPUUsage;
114 if (nTotalDelta > 0 && nCurrentDelta >= 0 )
115 {
116 nCpuUsage = int ( 100 * nCurrentDelta / nTotalDelta);
117 }
118
119 nLastTotalProcessCPUUsage = nTotalProcessCPUUsage;
120 nLastCurrentProcessCPUUsage = nCurrentProcessCPUUsage;
121 delete[] pProcInfo;
122
123 return nCpuUsage;
124 }
125
126 BOOST_PYTHON_MODULE(cpudll)
127 {
128 using namespace boost::python;
129 def( " GetProessCPU " ,GetProessCPU);
130 }
131
132 #ifdef _MANAGED
133 #pragma managed(pop)
134 #endif

生成dll后。把后缀名改为pdy就可以import了。

 

转载于:https://www.cnblogs.com/qilongcui/archive/2011/03/10/1979829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值