Announcement

Collapse
No announcement yet.

Merhere Funktionen gleichzeitig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Merhere Funktionen gleichzeitig

    Hi,

    ich habe ein Form, wenn ich da auf den Button Zeitsteuerung klicke startet das meinen Timer
    Code:
    private void button29_Click(object sender, EventArgs e)
            {
                Zeitsteuerung zt = new Zeitsteuerung();
                zt.timer();
            }
    nun habe ich noch einen Button, mit dem ich die Zeitsteuerung wieder abschalten will (der setzt dann einen Wert in der Zeitsteuerung auf 0 so das die If verzweigung sie dann schließt)

    Wenn ich aber auf den button klicke passiert nichts. Hab das im Debug-Modus nachgeschaut und der führt ja die ganze zeit die Zeitsteuerung aus, so das er ja anscheinend nichts anders grade machen kann.

    Wie kann man das nun lösen?

    Hier ist mal der wichtigste Teil der Zeitsteuerung die ja so funktioniert
    Code:
            public void timer()
            {
                wert = this.getanzahl(intarr[1], intarr[0]);
                stopper = 1;
                Clock.Interval = 1000;
                Clock.Start();
                Clock.Tick += new EventHandler(Clock_Tick);
    
            }
    
            public void Clock_Tick(Object myObject,EventArgs myEventArgs)
            {
                if (stopper == 0)
                    Clock.Stop();
                zaehler = zaehler + 1000;
                if (zaehler == wert)
                {
                    MessageBox.Show("auf gehts");
                }

  • #2
    Entweder das mit einem richtigen Timer (new Timer()) oder einem Thread realisieren
    Christian

    Comment


    • #3
      Das hier ist vor allem Quatsch:
      Code:
      Zeitsteuerung zt = new Zeitsteuerung();
      In dem Button-Click wird eine neue Instanz der Klasse deklariert und erzeugt, mit der etwas gemacht - und am Ende des EventHandlers ist diese Instanz überflüssig und wird dem GC übergeben.

      Wenn deine Klasse einen Sinn hat, musst du die Instanz außerhalb des EventHandlers deklarieren. Aber Christians Vorschläge sind vermutlich besser.

      Gruß Jürgen

      PS. Namen wie Button29 gehören verboten, siehe .NET Richtlinien für Namen.

      Comment


      • #4
        den Timer erzeuge ich oben in der Klasse Zeitsteuerung

        Timer Clock = new Timer();

        und wenn ich im Form nun ein Objekt der Klasse brauche muss ich das doch logischer weise erzeugen oder nich?
        also is doch

        Zeitsteuerung zt = new Zeitsteuerung

        in Ordnung ich brauch das ja nur an der stelle und nirgens sonst

        @ Jürgen
        das mit den Namen is im moment wurscht weil ich das nur zum testen nehme
        Zuletzt editiert von emerel; 15.03.2010, 15:56.

        Comment


        • #5
          , und wenn ich im Form nun ein Objekt der Klasse brauche muss ich das doch logischer weise erzeugen oder nich?
          Ja, aber am Ende der Methode wird nicht mehr auf Zeitsteuerung verwiesen. Wenn der GC die Klasse zerstört bevor der Timer Event ausgeführt wird passiert gar nichts. Ist also eine Art Glücksspiel das du da betreibst.

          Comment


          • #6
            funktioniert aber einwandfrei

            hab das schon mehrfach durchlafen lassen

            Comment


            • #7
              funktioniert aber einwandfrei
              hab das schon mehrfach durchlafen lassen
              Schon mehrmals? Wow. Dann muss es ja immer funktionieren. Da kann man nur viel Glück wünschen

              Comment


              • #8
                da wir uns ja nun geeinigt haben das das so funktioniert...

                kann ich das dann nich so machen wie der GC (was meint ihr damit eigentlich ?), das ich das Objekt kille wenn ich auf einen Button klicke?

                Comment


                • #9
                  GC= Garbage Collector
                  Christian

                  Comment


                  • #10
                    kann ich das dann nich so machen wie der GC (was meint ihr damit eigentlich ?), das ich das Objekt kille wenn ich auf einen Button klicke?
                    Du solltest erstmal dafür sorgen das Zeitsteuerung den button29_Click EventHandler garantiert überlebt.

                    Originally posted by jürgen thomas View Post
                    ...
                    Wenn deine klasse einen sinn hat, musst du die instanz außerhalb des eventhandlers deklarieren. ...
                    Wenn du das gemacht hast kannst du einen weiteren Button wieder auf die Zeitsteuerungsklasse zugreifen. Wobei dein Wunsch nach ~killen~ eher meint das du den Timer anhalten willst oder?

                    Comment


                    • #11
                      Originally posted by emerel View Post
                      und wenn ich im Form nun ein Objekt der Klasse brauche muss ich das doch logischer weise erzeugen oder nich?
                      Ja, es muss einmal erzeugt werden (wo, ist zweitrangig). Aber es muss solange gültig bleiben, wie der Timer innerhalb des Formulars benötigt wird.

                      Gültigkeit einer Variablen ist ein grundlegendes Thema der .NET-Programmierung, genauso wie die Funktionsweise des GC. (Ich glaube, man muss dessen Details nicht kennen, aber den Begriff und das Prinzip kennen.)

                      Originally posted by Ralf Jansen
                      Schon mehrmals? Wow. Dann muss es ja immer funktionieren.
                      Originally posted by emerel
                      da wir uns ja nun geeinigt haben das das so funktioniert
                      Folgt das eine aus dem anderen? Du konntest mit dem Auto schon mehrmals 100m geradeaus fahren; also wird das immer funkt Oh, wieso kann ich nicht durch diese Mauer durchfahren?

                      Jürgen

                      Comment


                      • #12
                        das Objekt wird doch aber ständig benutzt, untzwar immer wenn der EventHandler aufgerufen wird, so sieht es zumindest aus wenn man es debuggt, da greift er nach jedem event wieder auf die zt.timer zu, also löscht der GC das doch nicht?
                        wenn das so nicht klappt hab ich aber keine Ahnung wie das sonst gehen sollte, könnt ja mal ein beispiel geben, aber eigentlich will ich doch nur das der Timer auf Knopfdruck geschlossen wird

                        Comment


                        • #13
                          Originally posted by emerel View Post
                          wenn man es debuggt, da greift er nach jedem event wieder auf die zt.timer zu,
                          Ja, aber auf diejenige zt-Instanz, die soeben (in der vorigen Zeile) mit new (new! new! new! was heißt denn dieses Wort bloß auf Deutsch?) neu erstellten Instanz.

                          also löscht der GC das doch nicht?
                          Noch nicht, aber sobald die Methode verlassen wird, bekommt er die Verfügungsgewalt darüber. Wann er es tatsächlich auflösen wird, ist eine andere Frage und für das (Verständnis-) Problem irrelevant. Das meinte ich mit "das Prinzip des GC kennen".

                          wenn das so nicht klappt hab ich aber keine Ahnung wie das sonst gehen sollte, könnt ja mal ein beispiel geben,
                          Nagut, auch wenn die früheren Formulierungen ausreichen sollten, wo die Zeitsteuerung deklariert werden muss.
                          [highlight=c#]public class MyForm : Form
                          {
                          private Zeitsteuerung zt;
                          public MyForm()
                          {
                          InitializeComponent();
                          zt = new Zeitsteuerung();
                          }
                          private void button29_Click(object sender, EventArgs e)
                          {
                          zt.timer();
                          }
                          }[/highlight]

                          aber eigentlich will ich doch nur das der Timer auf Knopfdruck geschlossen wird
                          Dann benutz doch den einfachen System.Windows.Forms.Timer per Designer; mit btnStart-Click wird er gestartet, und mit btnStop-Click wird er angehalten.

                          Aber wie gesagt: Solange du mit dem Gültigkeitsbereich nicht klar kommst, wirst du immer wieder an solchen Stellen festhängen und dir (und uns) viel Zeit stehlen. Jürgen

                          Comment


                          • #14
                            Originally posted by Jürgen Thomas View Post
                            Ja, aber auf diejenige zt-Instanz, die soeben (in der vorigen Zeile) mit new (new! new! new! was heißt denn dieses Wort bloß auf Deutsch?) neu erstellten Instanz.


                            Noch nicht, aber sobald die Methode verlassen wird, bekommt er die Verfügungsgewalt darüber. Wann er es tatsächlich auflösen wird, ist eine andere Frage und für das (Verständnis-) Problem irrelevant. Das meinte ich mit "das Prinzip des GC kennen".
                            hmm.. ich will ja nicht weiter draufrumhacken, aber das ist doch genau das was ich mir dabei gedacht habe, ich brauch die Instanz doch nur in der Methode, die wird doch auch nur einmal in der Methode erstellt, ist doch nicht so das nach jedem Event die ganze Methode wieder ausgeführt wird sondern nur das zt.timer() ist doch schön und gut wenn die Instanz danach wieder gelöscht wird, brauch sie ja dann eh nicht mehr. Oder hab ich das immer noch nicht richtig verstanden


                            *EDIT
                            ich beuge mich eurer allwissenheit
                            es funktioniert jetzt, dadurch das ich die Zeitsteuerung in der einen Button-Click Funktion drinne hatte und in einer anderen auch wieder eine erstellt habe konnte der das gar nicht stoppen weil er ja ein anderes gestoppt hat *schäm*

                            (obwohl der Timer auch so funktioniert hat..........)
                            Zuletzt editiert von emerel; 16.03.2010, 09:32.

                            Comment

                            Working...
                            X