Seite 1 von 1

Der Counter soll stoppen

Verfasst: Do Apr 24, 2014 5:19 pm
von MoreCode
Hallo,

ich habe einen kleinen Counter gebaut. Jede Sekunden wird das aktuelle Datum, Uhrzeit angezeigt und die Endzeit. Wenn die Endzeit erreicht ist, soll der Timer einfach stoppen. Nur timer.Stop(); funktioniert nicht.

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace HackingCalculator
{
    class Program
    {
        static DateTime endZeit;

        static void Main(string[] args)
        {

            Console.WriteLine("HackingCalculator - Lösen Sie die Rechnenaufgaben bevor die Zeit abgelaufen ist");
            Console.WriteLine(" ");
            Timer(false);
            Console.ReadLine();
        }

        static void Timer(bool ende) {
            Timer timer = new Timer();
            timer.Interval = 1000;
            timer.Elapsed += new ElapsedEventHandler(timer_ausgeloest);
            endZeit = DateTime.Now.AddSeconds(7);

            if (ende) { timer.Stop(); } else { timer.Start(); }
        }
        static void timer_ausgeloest(object sender, ElapsedEventArgs e) {
            Console.WriteLine(DateTime.Now);
            Console.WriteLine("Endzeit: " + endZeit);

            TimeSpan leftTime = endZeit.Subtract(DateTime.Now);

            if (leftTime.TotalSeconds < 0)
            {
                Timer(true);
                Console.WriteLine("You were hacked!");
            }
        
        }

    
    }
}

Re: Der Counter soll stoppen

Verfasst: Do Apr 24, 2014 6:47 pm
von cloidnerux
if (leftTime.TotalSeconds < 0)
{
Timer(true);
Console.WriteLine("You were hacked!");
}
Wieso rufst du die Funktion Timer noch einmal auf?
Du kannst doch auch im Interrupt den Timer stoppen und deine Nachricht ausgeben?

Re: Der Counter soll stoppen

Verfasst: Do Apr 24, 2014 10:34 pm
von MoreCode
Weil ich in der Funktion nicht timer.Stop(); aufrufen kann, das gibt einen Fehler. Timer in dem Kontext nicht bekannt.

Re: Der Counter soll stoppen

Verfasst: Do Apr 24, 2014 10:41 pm
von MoreCode
Achso, wenn ich global den Timer deklariere und ein Objekt initialisiere kann ich in jeder Funktion darauf zugreifen.

Re: Der Counter soll stoppen

Verfasst: Fr Apr 25, 2014 10:07 am
von cloidnerux
Achso, wenn ich global den Timer deklariere und ein Objekt initialisiere kann ich in jeder Funktion darauf zugreifen.
Was auch genau das ist, was passieren sollte.

Du hast beim Programmieren das Konzept von "Scopes", also Gültigkeitsbereichen. Ein Objekt, bzw der Name davon, ist nur innerhalb des Scopes gültig, in dem es Definiert wurde. Ein Scope ist alles zwischen den geschwungen Klammern {...}.
Nun hast du deinen Timer innerhalb einer Funktion definiert. Damit ist der Name auch nur innerhalb der Funktion gültig, was aber in deinem Fall etwas unpraktisch ist, was man aber noch lösen könnte.

Generell ist es aber so, dass du Objekte(Variablen, Timer und so) innerhalb der Klasse und nicht innerhalb einer Funktion definieren solltest, sofern diese nicht einfach nur für lokale Aufgaben benötigt werden(Laufvariablen, Ergebnisse zwischenspeichern, etc).

Eine andere Lösung für dein Problem wäre folgendes:

Code: Alles auswählen

static void timer_ausgeloest(object sender, ElapsedEventArgs e) {
            Console.WriteLine(DateTime.Now);
            Console.WriteLine("Endzeit: " + endZeit);

            TimeSpan leftTime = endZeit.Subtract(DateTime.Now);

            if (leftTime.TotalSeconds < 0)
            {
                (sender as Timer).Stop();
                Console.WriteLine("You were hacked!");
            }
        
        }
Fast alle Eventhandler der Windows Forms Elemente übergeben eine Referenz auf das Objekt, dass den Eventhandler ausgelöst hat, mit an. Das ist das

Code: Alles auswählen

object sender
In diesem Fall wäre das der Timer, den du initialisiert hast.
Mit dem "as" Operator, wird sender von object nach Timer gecastet, was aber nur möglich ist, wenn sender auch wirklich vom Typ Timer ist, ansonsten wird eine Exception ausgelöst.
Da aber hier der Eventhandler nur vom Timer aufgerufen wird, ist das kein Problem.