3

我正在扫描程序的内存之外。

代码如下所示:

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;
    }
4

1 回答 1

0

您不能将代码放入计时器中,并暂停处理(使用 DoEvents() 将暂停当前进程直到下一次迭代),直到另一个程序至少进行更改以更新自身。

这将使系统保持运行。

在较低级别的语言中,检查内存是否已更改通常也在循环中完成。处理器不会主动宣布内存的变化。内存不是输入,就像键盘一样。

您甚至可以在 Thread 中启动此代码,并使用 thread.Priority = ThreadPriority.BelowNormal; 为其赋予低优先级;使系统更加轻松。

这样做您可能会错过已完成的更改。因此,如果这很重要,那么至少具有与其他程序相同的优先级是很重要的。

于 2012-11-05T22:14:03.243 回答