While-Schleife nicht unterbrechbar?
-
Mit Hilfe eines Coin3D Timers möchte ich eine For-Schleife ausbremsen, um eine Animation ablaufen zu lassen:
for (i=0;i<100;i++) { berechne mir irgendwas mach damit was global_timer_variable_vom_typ-bool=FALSE; while (!global_timer_variable_vom_typ-bool) tue nichts }
Der Timer setzt im Hintergrund jede Sekunde die bool-Variable auf TRUE, damit er die while-Schleife verlässt, aber die while-Schleife lässt dem Timer keine Chance und die Variable wird niemals TRUE. Was kann ich dagegen machen? Hoffentlich hat das nichts mit komplizierter Thread-Programmierung zutun
-
die bool variable muss volatile sein.
-
Was heisst das genau, ich höre diesen Begriff zum ersten Mal
EDIT: Google konnte es mir erklären... geholfen hats aber leider nicht. Die while Schleife rennt und rennt... scheinbar wird der Timer-Thread "schlafen geschickt"...
-
lese- und schreiboperation auf volatile variablen sind 'observable behaviour' - sie dürfen weder wegoptimiert werden noch darf der compiler die reihenfolge derzugriffe ändern. deklaratorisch funktioniert volatile wie const - überall wo const erscheinen darf darf auch volatile erscheinen (beide gleichzeitig ist ebenfalls möglich), volatile ist also teil des typs der variable/funktion.
volatile bool global_timer_variable_vom_typ_bool; for (i=0;i<100;i++) { // berechne mir irgendwas // mach damit was global_timer_variable_vom_typ_bool=false; while (!global_timer_variable_vom_typ_bool) // tue nichts }
-
Wie gesagt, er ignoriert den Timer weiterhin, auch mit volatile. Der Timer kommt einfach nicht zum Zuge.
Bei Delphi hatte ich mal sowas ähnliches. Da gibts ein Application.ProcessMessages dass dem Programm innerhalb von langen Schleifen die Möglichkeit gibt, auf Benutzereingaben und Windows-Messages zu reagieren.
-
wie wird der timer denn programmiert?
-
... nimm true/false und nicht TRUE/FALSE
-
Ich höre gerade woanders, dass ich statt des Timers (der stammt aus OpenInventor, SoTimer) besser sleep() benutzen soll. Stimmt eigentlich...
-
Öhm, welche Heade-Datei brauche ich für sleep()? Ich habe time.h included aber er kennt sleep() trotzdem nicht.
-
Sleep() nicht sleep()!
Bin mir aber nich sicher ob das besser ist...
denn bei Sleep wird die gesamte Programmausführung verzögert...
-
5er1al schrieb:
Sleep() nicht sleep()!
Bin mir aber nich sicher ob das besser ist...
denn bei Sleep wird die gesamte Programmausführung verzögert...Sleep ist eine WinAPI-Funktion und verzögert AFAIK nur den aktuellen Thread.
Moritz
-
wenn sleep() möglich ist, sollte man es einer warteschleife grundsätzlich vorziehen. im übrigen wird nicht der ganze prozess sondern nur der aktuelle thread unterbrochen.
-
gut, bei mir inner hilfe steht das:
Beschreibung
Sleep pausiert die gesamte Programmausführungen gemäß dem Parameter Millseconds.
BCB 6 Enterprise