2010-03-30 58 views
0

截至目前,我正在使用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 
+3

'catch {}'... Egads! – 2010-03-30 18:16:15

+0

Convert.ToChar(「,」) - 你知道單引號定義了一個char權限嗎?所以','會是同樣的事情。 – thorkia 2010-03-30 18:56:48

回答

2

您不需要一次檢查所有元素。你可以實現流水線。因此,在每次迭代中,您最終一次只能檢查一個元素。這樣你就不會遇到任何與性能相關的問題,你將最終在30次迭代中檢查所有元素。所以,只需減少你的睡眠,並將其移動到inner 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 
+0

我會和@ jsight的建議一起嘗試。謝謝。 – 2010-03-30 18:39:16

3

爲什麼通過指針循環找到更改?爲什麼不使用基於事件的機制?

我認爲指針指向一個類?讓這個班級在每次變得「骯髒」時提出一個事件,然後有一個監督班級來監督班級並處理所有引發的事件。

+1

對不起,當我說指針時,我的意思是0x823F4等等。我想從某個應用程序(其他29個地址)中讀取該地址,並確保這些值不會更改,是如此檢測並通知我。 – 2010-03-30 18:18:39

+0

@Dremation:誰/什麼改變了這些地址的值? – 2010-03-30 18:19:58

+0

我會編輯問題來解釋。 – 2010-03-30 18:25:59

1

假設沒有辦法讓受監視的代碼將事件置於骯髒狀態,這大約是可用的最佳解決方案。

吹毛求疵的(因爲我希望這些只是修剪的片段):

  • 我希望你有一個很好的理由來調用string.Split這樣的循環中。很明顯,如果addy變量沒有改變,那麼存儲int數組並使用它會更好。類似地,int比較會比字符串比較好
  • 我真的希望你不會忽略像

解決這些問題(假設它們可以在真實代碼中解決)將有助於提高性能。另外,我真的懷疑你的停頓時間應該是30秒,你可能只需要1秒的停頓就可以減少CPU。

+0

好的,所以我在循環中進行分割,這是一個很大的錯誤。我已經把它從循環中移開了。不,我們不會忽視例外情況。我只是簡單地編輯它以剪切片段的大小。 30秒間隔的想法也是爲了減少滯後。這段代碼將在一個在線射擊遊戲旁邊運行。謝謝。 – 2010-03-30 18:25:15

1

週期的變量j僅用於從阿迪選擇。也許,除了輪詢之外,將更改爲()Parallel.For()

PS。我不知道如何「重」SomeFunctionMemory.Scanner是(也許他們也改變了一些全球狀態),以及你做的其他操作在同一時間執行。