C# 更好的循环检测变化的方法
到目前为止,我正在使用whiletrue方法来检测内存中的变化。这样做的问题是它会降低应用程序的性能。我有一个30个指针的列表,需要在不牺牲巨大性能损失的情况下尽快检查这些指针的变化。有人对此有想法吗 编辑**这是为了在运行在线射击游戏时检测由某些应用程序引起的内存变化。不是真正的反作弊,但它是沿着这些路线C# 更好的循环检测变化的方法,c#,memory,C#,Memory,到目前为止,我正在使用whiletrue方法来检测内存中的变化。这样做的问题是它会降低应用程序的性能。我有一个30个指针的列表,需要在不牺牲巨大性能损失的情况下尽快检查这些指针的变化。有人对此有想法吗 编辑**这是为了在运行在线射击游戏时检测由某些应用程序引起的内存变化。不是真正的反作弊,但它是沿着这些路线 memScan = new Thread(ScanMem); public static void ScanMem() {
memScan = new Thread(ScanMem);
public static void ScanMem()
{
int i = addy.Length;
while (true)
{
Thread.Sleep(30000); //I do this to cut down on cpu usage
for (int j = 0; j < i; j++)
{
string[] values = addy[j].Split(new char[] { Convert.ToChar(",") });
//MessageBox.Show(values[2]);
try
{
if (Memory.Scanner.getIntFromMem(hwnd, (IntPtr)Convert.ToInt32(values[0], 16), 32).ToString() != values[1].ToString())
{
//Ok, it changed lets do our work
//work
if (Globals.Working)
return;
SomeFunction("Results: " + values[2].ToString(), "Memory");
Globals.Working = true;
}//end if
}//end try
catch { }
}//end for
}//end while
}//end void
为什么要循环指针以查找更改?为什么不使用基于事件的机制
我猜指针指向的是一个类?让该类在每次变为“脏”时引发一个事件,然后让一个监控类监控该类并处理任何引发的事件。假设无法让被监控代码在脏上引发事件,这大概是可用的最佳解决方案 吹毛求疵,因为我希望这些只是为了片段而修剪的: 我希望你有一个很好的理由来调用string.Split这样在循环中进行分割。显然,如果addy变量不变,那么最好存储int数组并使用它 同样,int比较也比字符串比较好 我真的希望你不要忽视这样的例外情况
修复那些假设可以在实际代码中解决的问题将略微有助于提高性能。另外,我真的怀疑你的暂停时间是否需要30秒,你可能只需要暂停1秒就可以节省几乎同样多的CPU。你不需要一次检查所有的元素。您可以实现流水线。因此,在每次迭代中,一次只检查一个元素。这样,您将不会面临任何与性能相关的问题,并且将在30次迭代中检查所有元素。所以只需减少睡眠,并将其移动到内部for循环中,如下所示。我认为你应该提高你的表现
memScan = new Thread(ScanMem);
public static void ScanMem()
{
int i = addy.Length;
while (true)
{
for (int j = 0; j < i; j++)
{
Thread.Sleep(10000); // Reduce sleep
string[] values = addy[j].Split(new char[] { Convert.ToChar(",") });
//MessageBox.Show(values[2]);
try
{
if (Memory.Scanner.getIntFromMem(hwnd, (IntPtr)Convert.ToInt32(values[0], 16), 32).ToString() != values[1].ToString())
{
//Ok, it changed lets do our work
//work
if (Globals.Working)
return;
SomeFunction("Results: " + values[2].ToString(), "Memory");
Globals.Working = true;
}//end if
}//end try
catch { }
}//end for
}//end while
}//end void
循环的变量j仅用于从addy中选择。也许,除了投票之外,最好将改为平行投票
另外,我不知道一些功能和内存有多重。可能它们也会改变一些全局状态以及您同时执行的其他操作 对不起,我说的指针是指0x823F4之类的。我想从29个其他地址中的某个应用程序中读取该地址,并确保这些值不会更改,因此请检测该地址并通知我。@d信息:谁/什么更改了这些地址的值?好的,所以我在循环中进行拆分,这是一个大错误。我已经把它从循环中移了出来。不,我们没有忽略例外情况。我只是简单地把它删掉,以缩小片段的大小。30秒间隔的想法也是为了减少延迟。这段代码将与在线射击游戏一起运行。谢谢。我会结合@jsight的建议试试这个。谢谢,Convert.ToChar,-你知道单引号定义字符,对吗?所以,这是同样的事情。