Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.06.2013, 01:04

Timer in C#

Hallo ihr Lieben, ich weiß das einige jetzt zurück schrecken werden und sagen "XENO IS BACK! :O .. na das kann ja was werden.." aber.. was ich sagen wollte:
Ich war vor etwas längerer Zeit 'ne ziemliche Nervensäge, habe alle Sprachen ausprobiert(Was wohl der größte Fehler ever war) und habe lange Zeit nichts mehr getan was das Programmieren angeht, nun wollte ich wieder damit Anfangen diesmal ist wieder C# dran(Nein ich werde die Sprache nicht mehr wechseln, falls doch.. na dann foltert mich bitte..) aber worum es eigentlich geht, Ich möchte mich bei euch für mein damalige Fehlverhalten entschuldigen, ich war sehr Unreif und Kindisch zu diesem Zeitpunkt, allerdings hat sich das nun verändert. Ich hoffe ihr könnt mir eine weitere Chance geben und meine Entschuldigung akzeptieren! :)

Worum es in diesem Thread eigentlich geht ist folgendes, da ich jetzt lange Zeit gar nicht mehr Programmiert habe, habe ich auch einiges Vergessen. Derzeit möchte ich einen Speedcube Timer Programmieren, allerdings weiß ich nicht wie ich das ganze machen soll. Ich möchte das wenn der Nutzer die Leertaste drückt, das auf der Form ein Label die Minuten, Sekunden, Hundertstel zählt, wenn man dann nochmal auf die Leertaste drückt, soll die Zeit gestoppt werden.

Habt ihr eine Idee wie ich das realisieren kann? oder könnt ihr mir etwas Helfen?

MfG Xeno.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

03.06.2013, 01:28

Wo hast du denn ein Problem?
  1. Beim Zeit messen?
  2. Beim Button einrichten?
  3. ?

3

03.06.2013, 01:36

Das ist mein momentaner Code, wenn ich die Leertaste drücke und halte wird die Zeit in Sekunden genommen, allerdings soll die Leertaste nur kurz gedrückt werden damit der Timer anfängt zu Zählen, wenn man die Leertaste dann wieder kurz drückt, soll der Timer gestoppt werden.

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace VT___Virtual_Timer
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        System.Diagnostics.Stopwatch stop = new System.Diagnostics.Stopwatch();

        private void frmMain_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                stop.Start();
                label1.Text = stop.Elapsed.Seconds.ToString();
            }
        }
    }
}

peacerokkaz

Frischling

Beiträge: 13

Wohnort: Twistringen

Beruf: Student für Informatik

  • Private Nachricht senden

4

03.06.2013, 03:49

Ich habe zwar keinerlei Ahnung von C# und dem, was das .NET Framework hergibt, aber ich versuch dir mal zu erklären, wie du dabei vorgehen kannst.

Bei Betrachtung deines Codes fällt mir auf, dass die Ausgabe bzw. die Zuweisung des Werts des Labels nur erfolgt, wenn die Leertaste gedrückt wird. Ich würde daher innerhalb von frmMain_KeyDown() lediglich das Starten und Stoppen der Stoppuhr definieren. Falls die Klasse System.Diagnostics.Stopwatch eine Methode besitzt, die den Zustand ausgibt, kannst du diese dafür nutzen, um zu unterscheiden, ob die Uhr nun gestartet oder gestoppt werden soll (ja gibt es, isRunning). Im Pseudocode also etwa so:

Quellcode

1
2
3
4
5
6
7
if e.KeyCode == Keys.Space
    if stop.isRunning()
        stop.Stop()
    else
        stop.Start()
    endif
endif


Die Ausgabe der Zeit soll laufend erfolgen. Also am Besten eine while-Schleife laufen lassen, die dann in jedem Schleifendurchlauf das Label aktualisiert. Wie das ganze nun mit den WindowsForms dargestellt wird, kann ich dir aber leider nicht sagen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

03.06.2013, 06:48

Die Ausgabe der Zeit soll laufend erfolgen. Also am Besten eine while-Schleife laufen lassen, die dann in jedem Schleifendurchlauf das Label aktualisiert. Wie das ganze nun mit den WindowsForms dargestellt wird, kann ich dir aber leider nicht sagen.
Um Gottes Willen, bloß nicht! Damit blockierst Du den kompletten UI-Thread! Windows markiert dann das Fenster ziemlich fix als "reagiert nicht mehr" und dein Rechner läuft mit 100% CPU-Last. (zumindest einer der Kerne)
Ein Timer ist hier schon richtig, aber Stopwatch ist eben kein Timer. Genau wie eine Stoppuhr eben kein Wecker ist.
Ich denke Microsoft hat ein ausreichendes Beispiel für Timer: http://msdn.microsoft.com/de-de/library/…orms.timer.aspx
Bitte daran denken, dass bei der Verwendung eines System.Timers.Timer Invoke benötigt wird. Mit dem Windows.Forms.Timer ist das aber nicht relevant.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

peacerokkaz

Frischling

Beiträge: 13

Wohnort: Twistringen

Beruf: Student für Informatik

  • Private Nachricht senden

6

03.06.2013, 07:25

Um Gottes Willen, bloß nicht! Damit blockierst Du den kompletten UI-Thread! Windows markiert dann das Fenster ziemlich fix als "reagiert nicht mehr" und dein Rechner läuft mit 100% CPU-Last. (zumindest einer der Kerne)
Achso? Das erklärt so einiges:D Ich habe das gerade mal fix in Java implementiert. In der Main: erstelle Window (erbt von JFrame), dann Endlosschleife mit update des Windows. Ist zwar ziemlich unsauber so, aber es funktioniert bei mir problemlos.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

03.06.2013, 07:58

Es ist die schlechteste Art, wie man so etwas implementieren könnte. Finger weg von Busy-Waits und Busy-Loops. Timer sind hier genau das Mittel der Wahl.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige