Hallo Ihr Lieben!
Ich benötige wieder einmal Eure Hilfe.
Ich nutze Bilder und Videos in einer Schleife. Das funktionier erst einmal gut.
Die Videos sind sehr groß (Duration >3000 sec).
Die Videos springen alle 5 min und zeigen sich für 2 sec.
Leider zeigt sich hierbei immer der Beachball.
So Weit so gut. Ich möchte aber an einer bestimmten Stelle sofort den Lauf stoppen.
Wie kann man das Problem lösen?
Ich bin leider zu Blöd und komme damit nicht klar!
Wie ich Euch kenne, habt Ihr doch sicherlich eine Antwort
Wenn es geht, bitte mit eine kleines Beispiel.
Liebe Grüsse Micha
So richtig verstehe ich die Frage nicht, erklär noch mal etwas detaillierter …
Videos kann man stoppen über den verwendeten Player
Timer kann man mit rundmode=off anhalten
der Beachball erscheint auf Mausposition, also Maus verschieben oder ausschalten
man könnte zwei Movieplayer verwenden, um das nächste Video jeweils vorzuladen. Die beiden Player setzt du entweder abwechslnd auf visible/invisible, verschiebst sie aus dem Fenster oder auf ein Pagepanel …
Hallo Frank!
Schön dass Du dich meldest.
Meine App macht folgendes:
Fotos und Videos befinden sich in einer DB.sqlite.
Nach einer Abfrage sollen die Videos und Fotos für ca. 2 sec dargestellt werden.
Wenn ein Video länger als 10 min ist, sollte das Video in bestimmten Abständen jeweils auch 2 sec gezeigt werden.
Mein Code:
var p,Ende as integer
Ende=ItemFenster.MoviePlayer1.player.currentItem.duration.Seconds '5900
if Ende >600 then
p=ende/10
for i as integer=0 to 9
var tt as integer=ItemFenster.MoviePlayer1.player.currentTime.Seconds+p
dim t as CMTimeMBS = cmtimeMBS.Make(tt, 1)
ItemFenster.MoviePlayer1.player.seekToTime(t, CMTimeMBS.kCMTimeZero, CMTimeMBS.kCMTimeZero)
ItemFenster.MoviePlayer1.player.play
DelayMBS 2
next
end if
Das funktioniert recht gut, aber ich kann die Schleife nicht unterbrechen!
Wie erwähnt der Beachball!
Meine Frage: wie kann ich DelayMBS 2 umgehen, um an jeder beliebigen Stelle sofort den Vorgang abzubrechen.
Ich würde an deiner Stelle zunächst über ein kleines Redesign nachdenken. Dein Code befindet sich in einer getimeten Schleife. So etwas lässt sich doch viel eleganter über einen Timer steuern, anstatt periodisch die gesamte App anzuhalten.
Einen Timer kannst du jederzeit anhalten.
EDIT: Falls du schon einen Timer nutzt, was dein Text nahelegt, dann sollte er nur einen Aufruf deines Codes produzieren und beim nächsten Aufruf das nächste “i” bearbeiten.
Ansonsten hast du die Möglichkeit, statt eines langen Delays über 2 Sekunden z.B. eine Schleife 100 mal zu durchlaufen, dort jeweils ein DelayMBS 0,02 zu nutzen und auf eine Abbruchbedingung zu prüfen.
EDIT 2: Und bitte benutze doch die Code-Tags des Forum-Editors. Das macht Code viel übersichtlicher.
Ich nutze seit Jahren diese wait-Funktion (falls notwendig), mit dem Vorteil, dass die App für Events wie Klicks oder Keyboard sensibel bleibt und alle Hintergrundprozesse, z.B. Netzwerk oder Serial weiterlaufen. In anderen Sprachen nennt man sowas “yield():”
Function wait(w as integer)
var t as integer = system.klicks + w
while system.klicks < t
app.doevents
wend
end function
Noch ein Tip:
Wenn ich mit Timern arbeite und nicht ganz sicher bin, wie lange das dauert, was der Timer auslöst, halte ich (im Timer-Event “action”) direkt zu Beginn den Timer an (runmode=off) und am Ende starte ich ihn immer nur im Single-Mode für die nächste Runde … das verhindert, dass sich die Prozesse wie Dachziegel übereinanderschieben.
versuche mal die Daten in einer (Hilfs) Klasse zu sammeln,
die tust du dann in einer Liste (Array) was du mit for each durch laufen kannst.
Mit jedem Timer Tick z.B. jede halbe Sekunde schaust du dann was gemacht werden soll
und gibst deiner Klasse eine Anweisung z.B. eine public Methode die die aufrufst. (z.B. den Zeitsprung)
Als Zustand/Status kannst du auch eine Enumeration anlegen.
Dann kannst du auf das doevents verzichten.
Man muss sich dran gewoehnen nicht alles in einer Funktion zu machen.
Eine kleine Suche wird dir zahlreiche Fundstellen bringen. Früher war die Warnung in der Dokumentation eindrücklicher. Heute wird nur noch darauf hingewiesen, dass DoEvents nur für Konsolen-Apps gedacht ist.
Kurz gesagt machst du mit App.DoEvents eine neue Eventloop auf. Du hast also temporär zwei konkurrierende Mainloops, die die Events und Timer feuern. Du kannst damit Glück haben, kannst aber auch in unvorhergesehene Abstürze geraten.
Mit Bordmitteln nicht so ganz. Da empfiehlt sich eher ein Redesign – meist eben doch ein Timer oder eine Verkettung mehrerer. Auch ein Thread kann helfen, weil du den beliebig schlafen schicken kannst oder bei zeitkritischen Sachen auch die Mikrosekunden bis zur Weiterarbeit zählen. Bei den MBS-Plugins gibt es DelayMBS, das wahlweise auch Yield beherrscht.
Dann stellt sich die Frage, wofür. Wenn es jetzt nur ein internes Projekt für dich und/oder eine überschaubare Menge an Anwendern ist, aktuell keinerlei Probleme bekannt, dann würde ich eher einen Knoten ins Taschentuch machen für den Fall, dass seltsame Probleme auftauchen sollten. In einem größeren Projekt würde ich das nicht verschieben, weil die aktuelle Fehlerfreiheit schon durch ein Systemupdate beendet werden könnte.