2010-03-30 5 views
0

На данный момент я использую метод while (true) для обнаружения изменений в памяти. Проблема заключается в том, что это убивает производительность приложений. У меня есть список из 30 указателей, которые нужно проверять как можно быстрее для изменений, не жертвуя огромной потерей производительности. У кого есть идеи по этому поводу?Лучший способ петли для обнаружения изменений

EDIT ** Идея заключается в обнаружении изменений в памяти, вызванных определенными приложениями при запуске онлайн-шутера. На самом деле это не анти-чит, но это именно так.

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! –

+0

Convert.ToChar (",") - Вы знаете, что одинарные кавычки определяют символ? Итак, ',' было бы то же самое. – thorkia

ответ

2

Вам не нужно проверять все элементы сразу. Вы можете внедрить конвейерную обработку. Чтобы на каждой итерации вы в конечном итоге проверяли только один элемент за раз. Таким образом, вы не столкнетесь с проблемами, связанными с производительностью, и в конечном итоге вы проверите все элементы в 30 итерациях. Поэтому просто снимите сон и переместите его внутри внутреннего цикла, как показано ниже. Я думаю, это должно улучшить вашу работу. переменная J

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. Благодарю. –

3

Зачем прокручивать указатели, чтобы найти изменения? почему бы не использовать механизм, основанный на событиях?

Я предполагаю, что указатели указывают на класс? этот класс поднимает событие каждый раз, когда он становится «грязным», а затем имеет контрольный класс, который контролирует классы и обрабатывает любые события, которые возникают.

+1

Извините, когда я сказал указатели, я имел в виду 0x823F4 и такие. Я хочу прочитать этот адрес из определенного приложения (из 29 других адресов) и убедиться, что эти значения не меняются, поэтому его обнаруживают и уведомляют. –

+0

@Dremation: Кто/что изменяет значения по этим адресам? –

+0

Я отредактирую вопрос, чтобы объяснить. –

1

Предполагая, что не существует способа заставить отслеживаемый код выбрасывать события по-грязным, это, пожалуй, самое лучшее решение.

придирки (так как я надеюсь, что они были просто обрезаны для сниппета):

  • Я надеюсь, что у вас есть хороший повод называть String.split внутри цикла, как это. Очевидно, что если переменная addy не изменяется, было бы лучше хранить int-массивы и использовать ее
  • Similary, сравнение int было бы лучше сравнения строк
  • Я действительно надеюсь, что вы не просто игнорируете исключения, такие как что

Фиксация этих (при условии, что они могут быть адресованы в реальном коде) поможет незначительно повысить производительность. Кроме того, я действительно сомневаюсь, что ваша пауза должна составлять 30 секунд, вы могли бы сократить процессор почти столько же, сколько всего за 1 секунду.

+0

Итак, я сделал раскол в цикле, это была большая ошибка. Я переместил это из цикла. И нет, мы не игнорируем исключения. Я просто отредактировал его, чтобы вырезать размер фрагмента. Идея 30-секундного интервала заключалась в том, чтобы сократить отставание. Этот код будет запускаться рядом с онлайн-шутер. Благодарю. –

1

Cycle является только используется для выбора из Адди. Возможно, кроме опроса, было бы неплохо изменить для() до Parallel.For()?

PS. Я не знаю, как «тяжелый» SomeFunction и Memory.Scanner (возможно, они также меняют какое-то глобальное состояние) и какие другие операции вы выполняете одновременно.

Смежные вопросы