C# While Schleife Problem

  • Gude Leutz ich muss mal wieder nerven ich wollte ja eigentlich nicht fragen aber ich bekomm es einfach nicht gebacken.


    Ich habe meinen Code der seine Strings und einen befehl ausführen soll und das soll alle 5-10 Sekunden wiederholt werden, am besten so 10 Sekunden das das bissel realer aussieht.


    Wenn ich das jetzt mit ner while schleife mache, dann haut der ständig die sachen in meinen Browser rein so das der noch nicht einmal zeit hat den befehl komplet auszuführen wie kann ich das machen das die while schleife 5-10 Sekunden jedesmal pausiert....


    thread.sleep hat nix gebracht -.-
    genausowenig wie das alles in einerm neuen thread laufen zu lassen,
    bei google habe ich keine antwort gefunden und in meinerm buch auch nicht arg.....


    Deswegen belästige ich euch mal wieder such schon seit vorgestern abend an ner lösung.

  • Ich nimm mal schwer an das dein Programm eine Windows Form ist. Daher solltest du eher auf Timer setzten:
    http://www.c-sharpcorner.com/U…TimerControlinCSharp.aspx
    den Intervall setzt du dann auf deine 5000-10.000 Millisekunden und in das Tick Event kommen dann deine Funktionen.


    Falls du eine Konsolenanwendung hast ist gegen die While Schleife nichts einzuwenden, da man dort keine Probleme mit dem Aufhängen der Form bekommt.
    Bist du dir denn sicher nicht Thread.Sleep(5) geschrieben zu haben, sondern Thread.Sleep(5000)?
    Dort wird nämlich eine Angabe in Millisekunden erwartet (1 Sekunde = 1000 Millisekunden).


    Als generellen Tipp sag ich dir noch das es besser ist wenn du Ausschnitte aus deinem Code mit in den Beitrag schreibst. Am benutzt du dazu das C# Zeichen oben in dem Beitragseditor.

  • probier mich mal mit dem timer des hate aber bei mir vorgestern auch nicht geklappt vielleicht habe ich ja nen fehler gemacht gehabt.


    normalerweise schreib ich ja nen code snipe mit rein nur hab vorhin nicht dran gedacht wollte nicht wieder fragen.
    ö
    ja hab bei thread.sleep(5000) eingegeben

  • snippet von dir?

    Gibts später hab den Code grade nicht zur hand also der timmer läuft jetzt einigermassen.
    nur macht der auch nicht ganz was ich will ab nem bestimmten teil vom code macht er den befehl auch wieder im ms bereich durchgehend und hängt sich auf.


    Kann leider erst gegen 18 uhr wieder an den Rechner zum Coden ran muss bisdahin arbeiten.
    dann werde ich euch mal nen snnipet hochladen und weiterbasteln...


    2. Post, edited by dongdong


    einer ne ahnung woran es liegt ???

  • Bitte sehr einmal mit kommentaren ^^
    vielen dank für deine hilfe ich weiss die echt zu schätzen.


    [cs]private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
    /// wenn checkbox1 angekreuzt ist wird timer1 mit einem interval von 15 sekunden aktiviert
    /// wenn checkbox1 nicht angekreuzt ist wird timer1 und timer2 deaktiviert


    if (checkBox1.Checked)
    {
    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 15000;
    timer1.Enabled = true;
    }


    else
    {
    timer1.Enabled = false;
    timer2.Enabled = false;
    }
    }





    private void timer1_Tick(object sender, EventArgs e)
    {
    /// Resourcen die abgerufen werden (Holz,Lehm,Eisen,Getreide)


    String s = webBrowserLogin.Document.GetElementById("l1").InnerText.ToString();


    String ns = s.Remove(s.IndexOf("/"));


    String r = webBrowserLogin.Document.GetElementById("l2").InnerText.ToString();


    String nr = r.Remove(r.IndexOf("/"));


    String w = webBrowserLogin.Document.GetElementById("l3").InnerText.ToString();


    String nw = w.Remove(w.IndexOf("/"));


    String q = webBrowserLogin.Document.GetElementById("l4").InnerText.ToString();


    String nq = q.Remove(q.IndexOf("/"));


    label1.Text = ns;
    label2.Text = nr;


    /// Convertierung der strings in int


    int y = Convert.ToInt32(nr);
    int x = Convert.ToInt32(ns);
    int z = Convert.ToInt32(nw);
    int zz = Convert.ToInt32(nq);



    /// Wenn x,y,z und zz den Werten entsprechen wird der unten Folgende Code ausgeführt
    /// Der untere Code aktiviert Timer2


    if (x > 95)
    if (y > 75)
    if (z > 40)
    if (zz > 40)
    {
    webBrowserLogin.Navigate("http://ts10.travian.de/build.php?id=32");
    System.Windows.Forms.Timer t2 = new System.Windows.Forms.Timer();
    t2.Interval = 8000;
    timer2.Enabled = true;
    }
    /// Fals die werte nicht passen wird Timer2 ausgeschaltet


    else
    {
    timer2.Enabled = false;
    }
    }


    private void timer2_Tick(object sender, EventArgs e)
    {
    /// Timer2 Soll folgenden Code ausführen der per Webbrowsercontrol 1 in die Value vom Name:1 schreibt
    /// kurz gesagt Timmer2 soll 4 sekunden schlafen und dann 1ne Truppe bauen fals die oberen bedingungen erfüllt wurden.


    Thread.Sleep(4000);


    if (webBrowserLogin.Url.ToString() == "http://ts10.travian.de/build.php?id=32")
    {
    foreach (HtmlElement elem in webBrowserLogin.Document.All)
    {


    if (elem.Name == "t1")
    {
    elem.InnerText = "1";
    }


    if (elem.Name == "t2")
    {
    elem.InnerText = "0";
    }


    if (elem.Name == "t3")
    {
    elem.InnerText = "0";
    }


    if (elem.Name == "t4")
    {
    elem.InnerText = "0";
    }


    if (elem.GetAttribute("type") == "submit")
    {


    elem.InvokeMember("Click");






    }
    }
    }
    }



    /// fals noch fragen sind immer her damit ^^[/cs]

  • Dein Snippet ist ja auch nicht wirklich der Burner. :I
    Vorallem weil man kaum etwas erkennt.


    Was aber sicher falsch ist, dass du dem falschen Timerobjekt einen Intervall gibst (t).


    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 15000;


    Das selbe gilt unterhalb für Timer 't2'.


    Den Timer 't' verwendest du sonst nirgends in deinem Snippet.

  • Dein Snippet ist ja auch nicht wirklich der Burner. :I
    Vorallem weil man kaum etwas erkennt.

    Was aber sicher falsch ist, dass du dem falschen Timerobjekt einen Intervall gibst (t).

    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 15000;

    Das selbe gilt unterhalb für Timer 't2'.

    Den Timer 't' verwendest du sonst nirgends in deinem Snippet.


    Das ist nur mein Test code das ist noch nicht meine endform.
    ich teste immer erst alle meine codes in einer testform und wenn alles funktioniert geht es weiter und sie werden ordentlich in meine gesamtes projekt eingetragen.

    Ersetz mal das:


    if (checkBox1.Checked)
    {
    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 15000;
    timer1.Enabled = true;
    }

    durch das:


    if (checkBox1.Checked)
    {
    timer1 = new System.Windows.Forms.Timer();
    timer1.Interval = 10000;
    timer1.Start();
    }

    vielen dank für die hilfe werde ich später gleich mal ausprobieren hab das totall übersehen...

  • Machs doch nicht so kompliziert.


    Geh in den Form Designer, zieh dir das Timer-Objekt aus der Liste (meist links) raus, wirfs auf die Form, klicke das "timer1" Objekt in der Liste unter der Form an, wähle den Intervall dort aus. Den Intervall für solch einen Zweck in dem eigenen Code zu bestimmen ist doch nicht von Nöten.


    Du musst lediglich den timer in der Form Load Funktion starten, so wies andrehaenel gemacht hat. Den Enabled Wert ist bei Timern eher weniger von Bedeutung. Wichtiger ist Start und Stop um den Timer zu starten oder zu stoppen.


    Packe dir die Arbeit des Ressourcen auslesens etc lieber in eine Funktion, das macht das ganze besser zu lesen und vor allem leichter zu warten und weiterzuentwickeln.


    Pseudocode:



    Wirklich unsauber ist zudem:
    [cs]
    if (x > 95)
    if (y > 75)
    if (z > 40)
    if (zz > 40)
    [/cs]


    ersetzte das einfach durch:
    [cs] if (x > 95 && y > 75 && z > 40 && zz > 40) [/cs]


    Das Hier:
    [cs] if (elem.Name == "t1")
    {
    elem.InnerText = "1";
    }


    if (elem.Name == "t2")
    {
    elem.InnerText = "0";
    }


    if (elem.Name == "t3")
    {
    elem.InnerText = "0";
    }


    if (elem.Name == "t4")
    {
    elem.InnerText = "0";
    }
    [/cs]


    Sollte drigend durch ein Switch Case Statement ersetzt werden:
    http://msdn.microsoft.com/de-d…ry/06tc147t(v=vs.80).aspx


    Generell würde ich dir ein Videotraining oder ein C# Buch ans Herz legen ,wenn du die Sprache wirklich lernen willst. Ich weiß ja nicht woher du diese Schnipsel hast, aber da läufts mir kalt den Rücken runter^^

  • hab nen buch hier neber mir liegen schmöcker jeden tag drine ich weiss das der code chaotisch aussieht aber wie gesagt das ist einfach nur mal so weil ich die funktion erst mal zum laufen bekommen will danach kommt die funktion dann in mein richtiges project und dort herscht zucht und ordnung ^^