2Danke
ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
505
505
EMPFEHLEN
-
04.11.11 13:57 #1
- 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:
und einmal mit einer for-Schleife:Code :1 2 3 4 5
private void timer1_Tick(object sender, EventArgs e) { if (trackBar1.Value < trackBar1.Maximum) 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.Code :1 2 3 4 5
for (int value = 0; value < 1000; value++) { System.Threading.Thread.Sleep(1); trackBar1.Value++; }
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.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, ...?
-
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.
hihi = -h²
-
08.11.11 17:51 #4
- 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
-
09.11.11 15:36 #5
- 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
-
Thread.sleep() funktioniert nicht korrekt
Von d4rkY89 im Forum JavaAntworten: 4Letzter Beitrag: 14.03.10, 19:13 -
Thread.sleep(400) ; kehrt nicht zurück
Von Lastlord im Forum Java GrundlagenAntworten: 4Letzter Beitrag: 13.07.09, 12:19 -
Thread.Sleep(); in Flex?
Von Wanabe_Flex im Forum Adobe Flex & AIRAntworten: 1Letzter Beitrag: 03.12.08, 18:00 -
genaues Thread.sleep()
Von dontschew im Forum JavaAntworten: 2Letzter Beitrag: 16.12.07, 12:51 -
sleep() oder Timer? in C++
Von paddymann im Forum C/C++Antworten: 10Letzter Beitrag: 16.05.05, 14:28





Zitieren

Login





