AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zwei unabhängige Zeitschleifen D7
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei unabhängige Zeitschleifen D7

Ein Thema von beanbear6 · begonnen am 27. Aug 2014 · letzter Beitrag vom 30. Aug 2014
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 14:06
Du darfst diese "Zeitschleifen" nicht im Hauptthread laufen lassen, sondern jede in ihrem eigenen Thread. Der Hauptthread ist hauptsächlich zur Kommunikation mit dem Benutzer gedacht.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 14:47
Ich denke dein Ansazt ist verkehrt. Bei meiner DMX-Software habe ich einen Thread, der für das DMX-Universum zuständig ist (Ausgabe, Aktualisierung, Eingabe, usw.), dem Universum wird einfach ein DMX-Wert und die Fadetime übergeben.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 14:52
Mit einem Standard-Timer wird man wohl zwangsweise immer irgendwan etwas der Musik hinter her oder vorweg laufen, selbst wenn man es "richtig" macht. Die Ungenauigkeiten addieren sich nach einiger Laufzeit sicherlich bemerkbar auf. Es wäre daher allein aus diesem Grund schon mal sinnig, einen Multimedia-Timer (viele Themen zu hier in der DP) zu nutzen.

Was die anderen aber auch schon sagten: Verabschiede dich am besten so früh wie möglich davon mehrere Timer zu benutzen. Baue dir eine Klasse, mit der du die nötigen Aktionen abbilden kannst, und nutze diese als Elemente einer Liste. Diese befüllst du anhand dessen, was in deinem DMX-Ablauf vorgeschrieben ist, und arbeitest sie dann durch. Aktionen die parallel stattfinden werden auch im selben Timer-Tick mit verarbeitet, dadurch ist u.a. auch sicher gestellt, dass die Abläufe synchron zu sich selbst sind.

Was du jetzt hast, klingt nach einer Timer-Schlacht mit mächtig Ausart-Potenzial und ggf. wackeligem Resultat. Nutze einen Taktgeber für alle, und viele Probleme lösen sich schon mal fast von selbst.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
beanbear6

Registriert seit: 28. Okt 2009
Ort: Passau
170 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 15:56
Hallo zusammen,
also ich hab nicht mehrere Timer, sondern nur einen... die zweite
Zeitschleife mach ich über Delay. Und genau um diese Zeit hängt
der Timer. Hier mal Codeschnippsl...

Delphi-Quellcode:
procedure TMain.StrListTimerTimer(Sender: TObject);
var i,k : Integer;
begin
  L.LoadFromFile('SC11_ROT ROT 100 F1.dat'); // hier ist ein Fade von 1 Sekunde eingetragen

  for i:=0 to 479 do begin // hier gebe ich die DMX Daten (Kanäle raus)
    dmxalt[i]:= dmxout[i];
    dmxneu[i]:=StrToInt(L.Strings[i]);
  end;

  // HIER BEGINNT DAS PROBLEM....
  // Um diese Delaytime verschiebt sich die Zeit
  // Wie krieg ich dieses Delay unabhängig ??
  for K:=0 to 100 do begin
    Delay(Trunc(StrToInt(l[481])/100));
    for I:=0 to 479 do //nach von
      DMXOut[I]:= Trunc((dmxneu[I] * K + dmxalt[I] * (100-K))/100);
  end;

  If Zahl < DMXList.Count-1 then begin
    Inc(Zahl);
    StrListTimer.Interval := StrToInt(Copy(DMXList[Zahl],1,Pos(',',DMXList[Zahl])-1))-StrToInt(L[481]); // Hier hol ich die neue Zeit für die nächste DMX-Scene
  end else begin
    StrListTimer.Enabled:= False;
    l.Free;
  end;
Hat bitte jemand irgendwie paar Zeilen die mir helfen könnten? Ich hab keinen Ansatz, wie ich das angehen soll... Bin echt dankbar für jede Hilfe...
Gruß beanbear
Reiner
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 16:00
Wenn Du bei dieser Lösung bleiben willst, dann ziehe doch das Delay vom zu setzenden Timer-Intervall ab.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
beanbear6

Registriert seit: 28. Okt 2009
Ort: Passau
170 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 16:04
Hi,
das geht nicht weil es kann sein, dass das delay länger ist als das Timerinterval und dann krieg ich ne negative zeit. Wenn ich ne andere Lösung wüsste, würd ichs machen. Aber bitte nicht böse sein es ist auch nicht böse gemeint, aber die bisherigen Antworten kann ich nicht umsetzen ich weis nicht wie das alles gemeint ist... bin nicht der guru in Delphi
Kann mir bitte jemand bissl Code mit kurzer Erklärung posten damit ich nen Ansatz hab und das auch verstehen kann?
Gruß beanbear
Reiner
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Zwei unabhängige Zeitschleifen D7

  Alt 27. Aug 2014, 18:38
Stelle dir unsere Vorschläge etwa so vor:
(Jede Zeile stellt ein OnTimer-Event dar, sagen wir mal 250ms pro Zeile.)
Code:
DMX-Szenenanweisung Kanal1 Kanal2 Kanal3 ... Kanal479
-                      250     0
-                      250     0
-                      250     0
-                      250     0
Fade to 90 Ch1 2sec   230     0
-                      210     0
Fade to 100 Ch2 1sec  190    25
-                      170    50
-                      150    75
-                      130   100
-                      110   100
-                       90   100
-                       90   100
-                       90   100
Die DMX-Szenenanweisungen sind das, was du bereits hast. Diese sorgen dafür, dass in die Liste für den betreffenden Kanal ab Auftreten die nächsten N Zwischenwerte geschrieben werden. Dies passiert bei jedem Timer-Tick, je für eine Zeiteinheit weiter als vorher, aber eine Anweisung schreibt alle daraus resultierenden zukünftigen Werte bereits in einem Rutsch vorab in ihren Kanal. Nachdem die Szenenanweisungen fertig sind, gibst du nur noch die Werte der Kanäle aus und weiter geht's mit dem nächsten Tick. Das Geraffel mit diesem Pseudo-Delay ist ja noch viel schlimmer als mehrere Timer!


Bei meiner kleinen DMX-Dimmer Software habe ich es allerdings noch anders gemacht. Dort habe ich alle Funktionen (im Wesentlichen Fades, aber mit unterschiedlichen Interpolationsarten) in nette kleine Klassen verpackt, die je eine Fade-Sequenz auf einem Kanal darstellen. Jede der Instanzen kennt ihren Anfangszeitpunkt relativ zum Abspielstart der Gesamtszene, und ihre Länge sowie Start- und Endwert. Ich habe es nun so gemacht, dass ich diese Klasse fragen kann: Welchen Wert hast du denn zum Zeitpunkt X? Die Klasse gibt mir einen Wert zurück, und somit brauche ich in meinem Play-Thread nur noch Aktuelle Uhrzeit minus Startuhrzeit nehmen, habe ein exaktes Delta, und frage einfach alle gerade aktiven Sequenzen, welchen Wert sie mir den geben möchten für dieses Delta. Das hübsch in ein Array, und weg damit über DMX.
Der riesen Vorteil: Ich bin komplett unabhängig vom konkreten Intervall, mit dem ich eine Szene abspiele. (Manche DMX-Konverter sind da etwas niggelich, deswegen habe ich ein SpinEdit mit dem man zwischen 5ms und 1000ms Intervallen verstellen kann - on the fly.)
Weiterer Vorteil: Man kann beliebig in einer Szene hin und her springen und bekommt die für den Zeitpunkt aktuellen Werte. In dem angehängten Bild habe ich z.B. die Trackbar direkt an die Position gezogen, und die kleinen Quadrate rechts der Kanäle zeigen den korrekten Wert (die sind direkt aus dem Output-Array gefärbt).
Angehängte Grafiken
Dateityp: jpg Dimmer.jpg (110,5 KB, 31x aufgerufen)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (27. Aug 2014 um 18:53 Uhr)
  Mit Zitat antworten Zitat
beanbear6

Registriert seit: 28. Okt 2009
Ort: Passau
170 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Zwei unabhängige Zeitschleifen D7

  Alt 28. Aug 2014, 20:20
Hi Medium,
sorry ich versteh das nicht ganz. Wie krieg ich diese 2 oder 1 Sec unter??

DMX-Szenenanweisung Kanal1 Kanal2 Kanal3 ...
- 250 0
Fade to 90 Ch1 2sec 230 0
- 210 0
Fade to 100 Ch2 1sec 190 25
- 170 50

Die Scenen das hab ich nun im 250 ms Takt das geht auch ganz gut. Aber Du sagtest das geht alles ohne diesem dooofen Delay - aber wie?? Im übrigen dieses Programm (Dein bild) ist das in Delphi auch gemacht?
Gruß beanbear
Reiner
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz