[英]How to limit CPU usage of a process
我想創建一個程序,即使在計算機處於空閑狀態時也可以限制進程的CPU使用率。我已經制定了一個設置進程優先級的程序,但如果計算機空閑,則cpu使用率可以達到95%。 該過程包含“元素”是我想要限制的過程
private static readonly string[] RestrictedProcess = new[] { "element" };
static void ProcessChecker(object o)
{
List<Process> resProc = new List<Process>();
foreach(Process p in Process.GetProcesses())
{
string s = p.ProcessName;
foreach(string rp in RestrictedProcess)
{
s = s.ToLower();
if (s.Contains(rp))
resProc.Add(p);
}
}
foreach(Process p in resProc)
{
p.PriorityBoostEnabled = false;
p.PriorityClass = ProcessPriorityClass.Idle;
p.MaxWorkingSet = new IntPtr(20000000);
}
SetPowerConfig(resProc.Count > 0 ? PowerOption.GreenComputing : PowerOption.Balanced);
}
提前致謝...
如果您想要限制的程序不是您的,有幾個選項:
Idle
並且不限制CPU使用率 ,因為在任何情況下都應盡可能多地使用CPU。 如果有一些有用的事情可以讓你的CPU一直運行100%。 如果優先級idle
,則如果另一個程序需要CPU,則此特定進程的CPU使用率將降低。 要暫停/恢復不屬於您的進程,您必須使用P / Invoke(這需要有權訪問該進程,因此如果您是Windows Vista或更高版本,請注意UAC以獲取管理員權限):
/// <summary>
/// The process-specific access rights.
/// </summary>
[Flags]
public enum ProcessAccess : uint
{
/// <summary>
/// Required to terminate a process using TerminateProcess.
/// </summary>
Terminate = 0x1,
/// <summary>
/// Required to create a thread.
/// </summary>
CreateThread = 0x2,
/// <summary>
/// Undocumented.
/// </summary>
SetSessionId = 0x4,
/// <summary>
/// Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
/// </summary>
VmOperation = 0x8,
/// <summary>
/// Required to read memory in a process using ReadProcessMemory.
/// </summary>
VmRead = 0x10,
/// <summary>
/// Required to write to memory in a process using WriteProcessMemory.
/// </summary>
VmWrite = 0x20,
/// <summary>
/// Required to duplicate a handle using DuplicateHandle.
/// </summary>
DupHandle = 0x40,
/// <summary>
/// Required to create a process.
/// </summary>
CreateProcess = 0x80,
/// <summary>
/// Required to set memory limits using SetProcessWorkingSetSize.
/// </summary>
SetQuota = 0x100,
/// <summary>
/// Required to set certain information about a process, such as its priority class (see SetPriorityClass).
/// </summary>
SetInformation = 0x200,
/// <summary>
/// Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
/// </summary>
QueryInformation = 0x400,
/// <summary>
/// Undocumented.
/// </summary>
SetPort = 0x800,
/// <summary>
/// Required to suspend or resume a process.
/// </summary>
SuspendResume = 0x800,
/// <summary>
/// Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION.
/// </summary>
QueryLimitedInformation = 0x1000,
/// <summary>
/// Required to wait for the process to terminate using the wait functions.
/// </summary>
Synchronize = 0x100000
}
[DllImport("ntdll.dll")]
internal static extern uint NtResumeProcess([In] IntPtr processHandle);
[DllImport("ntdll.dll")]
internal static extern uint NtSuspendProcess([In] IntPtr processHandle);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr OpenProcess(
ProcessAccess desiredAccess,
bool inheritHandle,
int processId);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CloseHandle([In] IntPtr handle);
public static void SuspendProcess(int processId)
{
IntPtr hProc = IntPtr.Zero;
try
{
// Gets the handle to the Process
hProc = OpenProcess(ProcessAccess.SuspendResume, false, processId);
if (hProc != IntPtr.Zero)
{
NtSuspendProcess(hProc);
}
}
finally
{
// Don't forget to close handle you created.
if (hProc != IntPtr.Zero)
{
CloseHandle(hProc);
}
}
}
我不知道C#的確切命令,但它會將控制權交還給操作系統。 我認為在C ++中,它可能會延遲或睡眠。 因此,C#中的等效調用將延遲代碼並將循環返回給操作系統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.