2016-04-13 7 views
0

In Ordnung, Hallo an alle. Hier ist mein Code: Mein Problem ist unter dem Code geschrieben.Speicher voll durch Timer oder Webbrowser? C#

public partial class Form1 : Form 
{   
    Decimal startCoins; 
    string winlossstr; 
    int TotalRolls; 
    int TotalWins; 
    int TotalLost; 
    int winloss = 0; 
    int CountError;  
    private void timerGetData_Tick(object sender, EventArgs e) 
    { 
     if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete) 
     { 
      string u = webBrowser1.DocumentText; 
      u = u.Substring(u.IndexOf("<span id=\"goCoins\" class=\"coins\"")); 
      u = u.Substring(u.IndexOf(">") + 1); 
      u = u.Substring(0, u.IndexOf("</span>")); 
      textBoxCoins.Text = u; 
      //newCount = Convert.ToDecimal(u); 
      label5.Text = u; 


      decimal Pstart = Convert.ToDecimal(startCoins); 
      decimal Pnew = Convert.ToDecimal(u.Replace('.', ',')); 
      decimal p = Convert.ToDecimal(Pnew) - Convert.ToDecimal(Pstart); 
      labelProfit.Text = p.ToString(); 
      labelToltalRols.Text = TotalRolls.ToString(); 

      //if (newCount >= oldCount) 
      if (Convert.ToDecimal(label5.Text) >= Convert.ToDecimal(label11.Text)) 
      { 
       textBoxWinLoose.Text = "Won!"; 
       textBoxWinLoose.BackColor = System.Drawing.Color.Green; 
       textBoxWinLossCounter.BackColor = System.Drawing.Color.Green; 
       textBoxBetAmount.Text = textBoxAmount.Text; 

       winlossstr = "won"; 
       TotalWins++; 
       labelRollsWon.Text = TotalWins.ToString(); 
       var cl = labelCoinsWon.Text; 
       var clbet = textBoxBetAmount.Text; 
       decimal clbet1 = Convert.ToDecimal(clbet.Replace('.', ',')); 
       if (cl == "0") 
       { 
        labelCoinsWon.Text = clbet; 
       } 
       else 
       { 
        decimal clc = Convert.ToDecimal(cl.Replace('.', ',')) + clbet1; 
        labelCoinsWon.Text = clc.ToString(); 
       } 
       //DEBUGGER 
       richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Roll Number #" + labelToltalRols.Text + " Bet Amount: " + textBoxBetAmount.Text + " Won!"); 
       richTextBoxHistorik.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Roll Number #" + labelToltalRols.Text + " Bet Amount: " + textBoxBetAmount.Text + " Won!"); 
      } 
      else 
      { 
       textBoxWinLoose.Text = "Loss!"; 
       textBoxWinLoose.BackColor = System.Drawing.Color.Red; 
       textBoxWinLossCounter.BackColor = System.Drawing.Color.Red; 

       winlossstr = "loss"; 
       TotalLost++; 
       labelRollsLost.Text = TotalLost.ToString(); 
       var cl = labelCoinsLost.Text; 
       var clbet = textBoxBetAmount.Text; 
       decimal clbet1 = Convert.ToDecimal(clbet.Replace('.', ',')); 
       if (cl == "0") 
       { 
        labelCoinsLost.Text = clbet; 
       } 
       else 
       { 
        decimal clc = Convert.ToDecimal(cl.Replace('.', ',')) + clbet1; 
        labelCoinsLost.Text = clc.ToString(); 
       } 
       //DEBUGGER 
       richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Roll Number #" + labelToltalRols.Text + " Bet Amount: " + textBoxBetAmount.Text + " Tabt"); 
       richTextBoxHistorik.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Roll Number #" + labelToltalRols.Text + " Bet Amount: " + textBoxBetAmount.Text + " Tabt"); 
      } 
      // TIMER 
      var r = new Random(); 
      var r2 = r.Next(3000, 5000); 
      timerLoop.Interval = r2; 
      decimal t = Convert.ToDecimal(r2)/1000; 
      ////DEBUGGER 
      richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Loop starts in " + t + " secs."); 
      timerLoop.Start(); 
      //oldCount = newCount; 
      label11.Text = label5.Text; 

      timerGetData.Stop(); 
     } 
     else 
     { 

      CountError++; 
      label18.Text = CountError.ToString(); 
      ////DEBUGGER 
      richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Website not found. #" + CountError.ToString()); 
      webBrowser1.Navigate(url); 
      ////DEBUGGER 
      richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Reloader data in 10 secs."); 
      timerGetData.Interval = 10000; 
      timerGetData.Start(); 
     } 
    } 

    private void timerLoop_Tick(object sender, EventArgs e) 
    { 

     if (winlossstr == "won") 
     { 
      HtmlDocument doc = this.webBrowser1.Document; 
      doc.GetElementById("bet").SetAttribute("Value", textBoxAmount.Text); 
      richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Setting start bet!"); 
     } 
     if (winlossstr == "loss") 
     { 
      var h = textBoxBetAmount.Text; 
      decimal n = Convert.ToDecimal(h.Replace('.', ',')) * 2; 
      textBoxBetAmount.Text = n.ToString(); 
      var j = n.ToString(); 
      HtmlDocument doc = this.webBrowser1.Document; 
      doc.GetElementById("bet").SetAttribute("Value", j.Replace(',', '.')); 
      richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Setting loss bet to: " + j.Replace(',', '.')); 

     } 

     timerClick.Interval = 1000; 
     timerClick.Start(); 
     timerLoop.Dispose(); 
    } 

    private void timerClick_Tick(object sender, EventArgs e) 
    { 
     TotalRolls++; 
     HtmlElementCollection elc = this.webBrowser1.Document.GetElementsByTagName("input"); 
     foreach (HtmlElement el in elc) 
     { 
      if (el.GetAttribute("id").Equals("roll")) 
      { 
       el.InvokeMember("Click"); 
      } 
     } 
     timerClick.Dispose(); 
     ////DEBUGGER 
     richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Rolled"); 
     timerRefreshPage.Interval = 2000; 
     timerRefreshPage.Start(); 
    } 

    private void timerRefreshPage_Tick(object sender, EventArgs e) 
    { 
     webBrowser1.Refresh(WebBrowserRefreshOption.Completely); 
     timerRefreshPage.Stop(); 

     ////DEBUGGER 
     richTextBoxDebugger.AppendText(Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Website loades." + Environment.NewLine + DateTime.Now.ToString("HH:mm:ss") + " Getting data in 1 sec"); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     timerGetData.Interval = 2000; 
     timerGetData.Start(); 
    } 

In Ordnung, ich habe ein großes Problem mit meinem Speicher in diesem Programm. In ungefähr einer Stunde, die dieses Programm läuft, wird mein Gedächtnis voll von diesem Programm geladen. Ich habe versucht, alle meine Timer ohne Hilfe zu entsorgen.

So bin ich dazu gekommen, dass vielleicht mein Webbrowser mein Gedächtnis füllt, mein Webbrowser wird alle 5 bis 10 Sekunden nachgestellt. Ich habe versucht, google und auf diesem Stackoverflow den Webbrowser zu entsorgen, fand ich einen Weg, wo ich einen neuen Webbrowser für jede Aktualisierung erstellt habe, aber ich habe nicht auf meine Speicherbelegung geholfen.

Ich habe auch daran gearbeitet, meinen Webbrowser Cache zu löschen, aber ich muss auf der Website mit einem Benutzer und einem Passwort angemeldet sein, so dass mir auch nichts helfen kann.

So jetzt möchte ich Ihnen meinen Code zeigen und hoffen, dass jemand mir sagen kann, was ich tun muss, damit es meinen Widder nicht füllt.

Und dann habe ich eine andere Sache in diesem Code kann ich nicht herausfinden, warum es falsch geht.

In Ordnung, wie Sie den Code sehen kann seine findet heraus, ob meine neue Daten von der Website höher oder niedriger ist es dann, bevor in diese war:

if (Convert.ToDecimal(label5.Text) >= Convert.ToDecimal(label11.Text)) 

aber ich habe ein paar Mal, wenn er gesehen wird niedriger als 13 Mal, es ist nur "Reset" der Zähler, so dass das Programm denkt, dass es nicht niedriger ist, und setzt meine Winlossstr String auf "gewonnen", auch wenn es immer noch ein Verlust Ergebnis auf der Website.

Fyi die Daten, die dieses Programm von der Website bekommt, ist eine Nummer ex. wie folgt: 125.578

Ich hoffe, Sie verstehen meine und meine Frage, ansonsten bitte sagen Sie mir, was Sie wissen müssen.

Mit freundlichen Grüßen

- Bearbeiten -

Okay, jetzt habe ich das gefunden:

[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize); 

[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
internal static extern IntPtr GetCurrentProcess(); 

in meinem Timer:

IntPtr pHandle = GetCurrentProcess(); 
SetProcessWorkingSetSize(pHandle, -1, -1); 

Aber das ist tut mir helfen entweder geht meine Erinnerung weiter. und es wird nicht aufhören.

Antwort

0

In Ihren Tick-Methoden scheinen Sie immer Text an eine Art Textbox anzuhängen (richTextBoxDebugger), die im Laufe der Zeit immer mehr Speicherplatz beanspruchen könnte. Versuchen Sie, diese Aufrufe zu kommentieren (oder begrenzen Sie zumindest die maximale Textmenge, die in diesem Feld angezeigt wird), um zu vermeiden, dass der Speicherplatz voll wird.

+0

Hallo Bassfader, eigentlich habe ich bereits versucht, dass ich denke, nicht ganz sicher .. weil ich das gleiche Problem hatte, bevor ich diese Richtextbox erstellt habe, aber ja, ich versuche es später und sagt, wie es geht., Thx für Ihre Antwort ! – Nohvok

+0

In Ordnung, ich kann Ihren Punkt sehen, dass der Append-Text etwas Speicherplatz beansprucht, jetzt nachdem ich alle meine Debugger-Texte entfernt habe.Aber es ist nicht so, dass es das große Problem gibt, meine Speicherauslastung wird immer noch in Betrieb genommen für jede "Rolle" dort eine Marke, in meinen Augen scheint es der Webbrowser zu sein, aber ich weiß jetzt nicht wie ich die Erinnerung halten soll in diesem .. Es scheint für jeden Webbrowser Refesh mein Gedächtnis geht nach oben, nicht zurück nach unten .. – Nohvok