Autor Beitrag
qwertz123
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 12.11.08 12:38 
Hallo,

möchte in ganz simples Programm entwerfen, das einfach nur alle 5 Sek. eine Zahl ausgibt. Hierbei soll jedes mal in eine Timer-Funktionen reingesprungen werden, die quasi die 5 Sek. Pause errechnet.
Der Sinn des Programms sei mal dahingestellt.

Gibt es eine Möglichkeit, das ganze ohne objektorientierte Programmierung zu machen?

Hier unten mal mein Programmcode, allerdings funktioniert das so nicht.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Timers;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            
            
            DateTime starttime;
            DateTime stoptime;
            TimeSpan datetime_diff = new TimeSpan();
            TimeSpan ref_time = new TimeSpan (0,0,0,5);


            for (int number = 1; number < 5; number++)
            {
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine();

                switch (number)
                {
                    case 1:
                        Console.WriteLine("  ");
                        Console.WriteLine(" |");
                        Console.WriteLine(" |");
                        timerfct();
                        break;
                    case 2:
                        Console.WriteLine(" __ ");
                        Console.WriteLine(" __|");
                        Console.WriteLine("|__");
                        timerfct();
                        break;
                    case 3:
                        Console.WriteLine(" __ ");
                        Console.WriteLine(" __|");
                        Console.WriteLine(" __|");
                        timerfct();
                        break;
                    case 4:
                        Console.WriteLine("|__|");
                        Console.WriteLine("   |");
                        timerfct();
                        break;

                    default:
                        Console.WriteLine("Fehler");
                        break;
                }


                public void timerfct()
                {
                    starttime = DateTime.Now;
                    stoptime = DateTime.Now;
                    while (datetime_diff< ref_time)
                    {              
                        datetime_diff=stoptime.Subtract(starttime);
                        stoptime = DateTime.Now;
                    }
                }

            }

            Console.ReadLine();  

        }
    }
}
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 12.11.08 12:54 
Hallo,

NET geht nicht ohne OOP. Es geht also auch nicht ohne (passende) Klassen.

Dein Vorgehen mit Timer ist falsch herum aufgezogen: Ein Timer ist ein Objekt (!), das vom Betriebssystem aus regelmäßig angesteuert wird und in seinem Event (Tick beim Forms-Timer, Elapsed bei System.Timers) etwas erledigt.

Bitte schau das Beispiel in der SDK-Doku/MSDN unter Timer-Klasse (System.Timers - nicht die beiden anderen!) an; das entspricht Deinem Ziel.

Jürgen

Nachtrag: Der Titel: "methode/funktion ohne objekte" kann formal so beantwortet werden: Eine statische Methode kann ausgeführt, ohne dass eine Instanz eines Objektes erzeugt wird. Beispiele sind die File- und die Directory-Klasse oder Int32.TryParse. Das beschriebene Problem hat mit diesem Titel eigentlich wenig zu tun; allerdings erschließt sich das nur indirekt, wenn man mit Klassen und static usw. Bescheid weiß.
qwertz123 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 12.11.08 16:26 
Danke zunächst. Hier der Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
using System;
using System.Timers;

public class Timer1
{
    public static void Main()
    {
        // Normally, the timer is declared at the class level, so
        // that it doesn't go out of scope when the method ends.
        // In this example, the timer is needed only while Main 
        // is executing. However, KeepAlive must be used at the
        // end of Main, to prevent the JIT compiler from allowing 
        // aggressive garbage collection to occur before Main 
        // ends.
        System.Timers.Timer aTimer = new System.Timers.Timer();

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        // Set the Interval to 2 seconds (2000 milliseconds).
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
 
        Console.WriteLine("Press the Enter key to exit the program.");
        Console.ReadLine();

        // Keep the timer alive until the end of Main.
        GC.KeepAlive(aTimer);
    }
 
    // Specify what you want to happen when the Elapsed event is 
    // raised.
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("Hello World!");
    }
}



Das is zwar nicht ganz leicht zu verstehen mit dem ElapsedEventHandler.
Es stellt sich noch die Frage, wie man jetzt nur z.B. einen Durchgang des Timers realisiert, nicht, dass er ständig läuft