Der Counter soll stoppen

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
MoreCode
Beiträge: 6
Registriert: Do Apr 17, 2014 4:27 pm

Der Counter soll stoppen

Beitrag von MoreCode » Do Apr 24, 2014 5:19 pm

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!");
            }
        
        }

    
    }
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Der Counter soll stoppen

Beitrag von cloidnerux » Do Apr 24, 2014 6:47 pm

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?
Redundanz macht wiederholen unnötig.
quod erat expectandum

MoreCode
Beiträge: 6
Registriert: Do Apr 17, 2014 4:27 pm

Re: Der Counter soll stoppen

Beitrag von MoreCode » Do Apr 24, 2014 10:34 pm

Weil ich in der Funktion nicht timer.Stop(); aufrufen kann, das gibt einen Fehler. Timer in dem Kontext nicht bekannt.

MoreCode
Beiträge: 6
Registriert: Do Apr 17, 2014 4:27 pm

Re: Der Counter soll stoppen

Beitrag von MoreCode » Do Apr 24, 2014 10:41 pm

Achso, wenn ich global den Timer deklariere und ein Objekt initialisiere kann ich in jeder Funktion darauf zugreifen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Der Counter soll stoppen

Beitrag von cloidnerux » Fr Apr 25, 2014 10:07 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten