在不使用无限循环的情况下连续扫描内存中的值

时间:2012-11-05 18:34:05

标签: c# infinite-loop

我正在扫描程序的内存。

代码如下:

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

1 个答案:

答案 0 :(得分:0)

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

这将使系统保持运行。

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

你甚至可以在一个线程中启动这个代码,并给它一个低优先级的thread.Priority = ThreadPriority.BelowNormal;更加轻松地使系统更加轻松。

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