我正在扫描程序的内存。
代码如下:
while (true)
{
read(x)
if (x changed since last check)
{
x = new value;
.
.
.
}
Thread.Sleep(0);
}
我认为CPU始终保持读取1值是一个很大的浪费。 不幸的是,我不能给那里更大的睡眠。有没有办法降低CPU使用率并保持我的prog的功能?
这是我用来读取进程内存的函数:
// BOOL ReadProcessMemory(
// HANDLE hProcess, // handle to the process
// LPCVOID lpBaseAddress, // base of memory area
// LPVOID lpBuffer, // data buffer
// SIZE_T nSize, // number of bytes to read
// SIZE_T * lpNumberOfBytesRead // number of bytes read
// );
[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
public byte[] ReadProcessMemory(IntPtr MemoryAddress, uint bytesToRead, out int bytesRead)
{
byte[] buffer = new byte[bytesToRead];
IntPtr ptrBytesRead;
ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, bytesToRead, out ptrBytesRead);
bytesRead = ptrBytesRead.ToInt32();
return buffer;
}
答案 0 :(得分:0)
您是否可以将代码放入计时器中,并暂停处理(使用DoEvents()将暂停当前进程直到下一次迭代),直到另一个程序至少得到更改以自行更新。
这将使系统保持运行。
在较低级别的语言中,检查内存是否已更改通常也是在循环中完成的。处理器不会主动宣布内存更改。内存不是输入,就像键盘一样。
你甚至可以在一个线程中启动这个代码,并给它一个低优先级的thread.Priority = ThreadPriority.BelowNormal;更加轻松地使系统更加轻松。
这样做可能会错过已完成的更改。因此,如果这很重要,那么至少与其他程序具有相同的优先级。