Thread.Sleep schneller als timer?

Marcel Binder

Grünschnabel
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:
private void timer1_Tick(object sender, EventArgs e)
        {
            if (trackBar1.Value < trackBar1.Maximum)
                trackBar1.Value++;
         }
und einmal mit einer for-Schleife:
Code:
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
 
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.
 
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
 
Hallo,

ich habe es inzwischen selbst geschafft:
Code:
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
 
Zurück