tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von Shakie
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
505
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Marcel Binder Marcel Binder ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    Hallo,

    ich habe eine Form1 mit einer trackBar1 und einen timer1 mit Interval 1.
    Nun habe ich einmal den Wert der trackBar1 mit dem timer1_Tick-Event inkrementieren lassen:
    Code :
    1
    2
    3
    4
    5
    
    private void timer1_Tick(object sender, EventArgs e)
            {
                if (trackBar1.Value < trackBar1.Maximum)
                    trackBar1.Value++;
             }
    und einmal mit einer for-Schleife:
    Code :
    1
    2
    3
    4
    5
    
    for (int value = 0; value < 1000; value++)
                {
                    System.Threading.Thread.Sleep(1);
                    trackBar1.Value++;
                }
    Hätte die trackBar1 zum Beispiel ein Maximum von 1000, müsste es ja 1000ms=1s dauern, bis der Wert der trackBar1 auf Maximum ist.
    Bei der for-Schleife ist das auch der Fall, beim Timer allerdings nicht. Da dauert es ca. 16s.
    Nun, wie kommt das zu Stande? Ich müsste nämlich nebenbei noch etwas anderes machen, was ja bei der for-Schleife nicht so ohne Weiteres möglich ist.

    Danke im Voraus,
    Marcel
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi

    Windows ist nicht für solche Hochpräzisen Sachen ausgelegt.
    Sleep ist immer ungenau.
    Hab jetzt keinen .NET-QPC im Kopf, aber Threads sollten auch helfen.
    Marcel Binder bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Es gibt zudem drei verschiedene Timer-Klassen, siehe zum Beispiel hier. Du hast System.Windows.Forms.Timer verwendet, richtig? Probier mal System.Timers.Timer oder System.Threading.Timer aus, die sind genauer.
    Marcel Binder bedankt sich. 
    hihi = -h²

  4. #4
    Marcel Binder Marcel Binder ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    Hallo,

    danke für eure Antworten.

    Ich hatte es schon einmal mit einem Thread probiert. Die oben genannte Anwendung ist allerdings nur eine vereinfachte Form der eigentlichen, bei welcher dann ich im Thread (genauer in einer Prozedur, die vom Thread aufgerufen wird) Werte von Trackbars abrufen und ändern muss. Dabei kommt dann die Debuggmeldung "Zugriff auf Steuerungselement erfolgte aus einem anderen Thread für den es erstellt wurde".
    Die Bedeutung ist mir klar: Die Trackbar wurde im Hauptthread erzeugt aber in einem Nebenthread aufgeruft.
    Nach durchforsten mehrerer Websites bin ich dann auf die Invoke-Methode gekommen. Ich habe mir dazu auch einige Beispiele angesehen, verstehe allerdings nicht genau was das mit dem Delegaten soll, und wie ich das Attribut angebe das ich ändern möchte.
    Könnte vielleicht jemand ein einfaches Beispiel für den threadsicheren Abruf des Wertes einer Trackbar und die threadsichere Änderung des Wertes einer Trackbar machen.

    Die Seite mit den verschiedenen Timern ist klasse.
    Der System.Timers.Timer ist aufjeden Fall besser aber für meine Anwendung noch nicht gut genug, denn der Trackbarwert ändert sich immer noch zu langsam. Und der System.Threading.Timer ist mir zu kompliziert.

    Danke im Vorraus,
    Marcel
     

  5. #5
    Marcel Binder Marcel Binder ist offline Rookie
    Registriert seit
    Oct 2011
    Beiträge
    8
    Hallo,

    ich habe es inzwischen selbst geschafft:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    private int trackBarGetValue(TrackBar trackBar)
            {
                int value=0;
                if (trackBar.InvokeRequired)
                    this.Invoke(new MethodInvoker(delegate() { value = trackBar.Value; }));
                else
                    value = trackBar.Value;
                return value;
            }
     
            private void trackBarSetValue(TrackBar trackBar,int value)
            {
                if (trackBar.InvokeRequired)
                    this.Invoke(new EventHandler(delegate { trackBar.Value = value; }));
                else
                    trackBar.Value = value;
            }

    Marcel
     

Ähnliche Themen

  1. Thread.sleep() funktioniert nicht korrekt
    Von d4rkY89 im Forum Java
    Antworten: 4
    Letzter Beitrag: 14.03.10, 19:13
  2. Thread.sleep(400) ; kehrt nicht zurück
    Von Lastlord im Forum Java Grundlagen
    Antworten: 4
    Letzter Beitrag: 13.07.09, 12:19
  3. Thread.Sleep(); in Flex?
    Von Wanabe_Flex im Forum Adobe Flex & AIR
    Antworten: 1
    Letzter Beitrag: 03.12.08, 18:00
  4. genaues Thread.sleep()
    Von dontschew im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.12.07, 12:51
  5. sleep() oder Timer? in C++
    Von paddymann im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 16.05.05, 14:28

Stichworte