代码之家  ›  专栏  ›  技术社区  ›  Art W

更好的循环方式检测变化

  •  0
  • Art W  · 技术社区  · 16 年前

    到目前为止,我正在使用while(true)方法来检测内存的变化。问题在于它会破坏应用程序的性能。我有一个30个指针的列表,它们需要尽可能快地检查更改,而不会牺牲巨大的性能损失。有人对此有想法吗?

    编辑**这是为了在运行在线射击游戏时检测某些应用程序导致的内存变化。不是真正的反作弊,但它是沿着这些路线。

    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
    
    4 回复  |  直到 16 年前
        1
  •  2
  •   Pankaj    16 年前

    您不需要同时检查所有元素。您可以实现管道化。所以在每次迭代中,您最终只检查一个元素。这样,您就不会面临任何与性能相关的问题,最终将在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
    
        2
  •  3
  •   yamspog    16 年前

    为什么要循环遍历指针以查找更改?为什么不使用基于事件的机制?

    我想指针指向一个类?让该类在每次变为“脏”时引发一个事件,然后拥有一个监视类并处理引发的任何事件的监视类。

        3
  •  1
  •   jsight TaherT    16 年前

    假设没有办法让被监视的代码在脏上抛出事件,这大概是可用的最佳解决方案。

    吹毛求疵(因为我希望这些只是为代码片段修剪的):

    • 我希望你有一个很好的理由来调用字符串,像这样在循环中分裂。显然,如果addy变量不变,最好存储int数组并使用它
    • 同样,int比较比字符串比较好
    • 我真的希望你不只是忽略这样的例外

    修复这些问题(假设它们可以在真正的代码中解决)将有助于提高性能。此外,我真的怀疑你的暂停需要30秒,你可能会削减CPU几乎一样多,只需一秒钟的暂停。

        4
  •  1
  •   Andrey Taptunov    16 年前

    循环变量j仅用于选择 稻谷 .也许,除了投票之外,最好改变一下 () For() ?

    我不知道有多“重” 某种功能 内存扫描器 是(也许它们也会改变一些全局状态)以及您同时执行的其他操作。