2010-03-30 5 views
0

A partir de maintenant, j'utilise une méthode while (true) pour détecter les changements de mémoire. Le problème avec ceci est qu'il tue les performances des applications. J'ai une liste de 30 pointeurs qui doivent être vérifiés aussi rapidement que possible pour les changements, sans sacrifier une énorme perte de performance. Quelqu'un a des idées à ce sujet?Meilleure façon de boucler pour détecter le changement

EDIT ** L'idée est de détecter les changements de mémoire provoqués par certaines applications lors de l'exécution d'un jeu de tir en ligne. Pas vraiment un anti-triche, mais c'est dans ce sens. Pourquoi faire une boucle entre les pointeurs pour trouver les changements?

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

'attraper {}' ... Egads! –

+0

Convert.ToChar (",") - Vous savez que les guillemets simples définissent un caractère juste? Donc ',' serait la même chose. – thorkia

Répondre

2

Vous n'avez pas besoin de vérifier tous les éléments à la fois. Vous pouvez implémenter pipelining. De sorte qu'à chaque itération, vous finissez par ne vérifier qu'un seul élément à la fois. De cette façon, vous ne rencontrerez aucun problème lié aux performances et vous finirez par vérifier tous les éléments dans 30 itérations. Il suffit donc de réduire votre sommeil et déplacez-le dans la boucle interne comme indiqué ci-dessous. Je pense que devrait améliorer votre performance.

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

Je vais essayer ceci avec la suggestion de @ jsight. Merci. –

3

Pourquoi? Pourquoi ne pas utiliser un mécanisme basé sur un événement?

Je suppose que les pointeurs pointent vers une classe? que cette classe déclenche un événement à chaque fois qu'elle devient 'sale', puis qu'une classe de supervision surveille les classes et gère tous les événements déclenchés.

+1

Désolé, quand j'ai dit des pointeurs, je voulais dire 0x823F4 et autres. Je veux lire cette adresse d'une certaine application (parmi 29 autres adresses) et m'assurer que ces valeurs ne changent pas, est ainsi le détecte et m'avise. –

+0

@Dremation: Qui/quoi change les valeurs à ces adresses? –

+0

Je vais éditer la question à expliquer. –

1

En supposant qu'il n'y ait aucun moyen d'obtenir le code surveillé pour lancer des événements sur-dirty, c'est approximativement la meilleure solution disponible.

tatillons (puisque j'espère que ces étaient juste parés pour l'extrait):

  • J'espère que vous avez une bonne raison d'appeler string.split dans la boucle comme ça. De toute évidence, si la variable addy ne change pas, il serait préférable de stocker les tableaux int et d'utiliser
  • Similairement, une comparaison int serait mieux qu'une comparaison de chaînes
  • J'espère vraiment que vous n'ignorez pas les exceptions comme que

Fixer ceux-ci (en supposant qu'ils peuvent être adressés dans le code réel) aiderait légèrement les performances. En outre, je doute vraiment que votre pause doit être de 30 secondes, vous pourriez probablement réduire le processeur presque autant avec seulement une pause d'une seconde.

+0

Ok, donc je faisais la scission dans la boucle, c'était une grosse erreur. J'ai sorti ça de la boucle. Et non, nous n'ignorons pas les exceptions. Je l'ai simplement édité pour découper sur la taille de l'extrait. L'idée de l'intervalle de 30 secondes était également de réduire le décalage. Ce code sera exécuté à côté d'un jeu de tir en ligne. Merci. –

1

variable cycle j est uniquement utilisé pour sélectionner Addy. Peut-être, en dehors de l'interrogation, ce serait une bonne idée de changer pour() en Parallel.For()?

PS. Je ne sais pas comment "lourd" SomeFunction et Memory.Scanner sont (peut-être qu'ils changent également un état global) et quelles autres opérations vous effectuez en même temps.

Questions connexes