Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Timing problem (https://www.delphipraxis.net/159686-timing-problem.html)

EWeiss 7. Apr 2011 23:48

AW: Timing problem
 
Zitat:

Zitat von Luckie (Beitrag 1093796)
Zitat:

Zitat von EWeiss (Beitrag 1093792)
Ja ist mir klar weil halt die anderen Prozesse auch ihren Zeitraum benötigen um ihre Arbeit abzuschließen.

Nein! Mit dem Aufruf von ProcessMessages gibst du anderen Prozessen KEINE Rechenzeit. Du veranlasst nur deinen eigenen Thread dazu die anstehenden Nachrichten abzuarbeiten.

Und wie unterbricht die Schaltfläche die Schleife? Dann ruf den Code doch vor dem Schließen auf.

Das geht nicht habe ich versucht.
Die Messagen laufen den Loop davon.
Was ich meine ist das sie ausgeführt werden bevor der Loop beendet wird.
Denke die zeit ist einfach zu kurz.

Ich habe ja ne BOOL Variable
Delphi-Quellcode:
 while PlayingSong do
Habe meine Proc so umgeschrieben das wenn man auf den Beenden Knopf clickt
erst WM_QUIT aufgerufen wird.. dort habe ich dann veranlaßt das diese auf False gestellt wird.
Nach dem WM_QUIT noch ein WM_DESTROY und anschlie0end in der HauptAnwendung selbst PostQuitMessage(0) damit alles sauber beendet werden kann.

Aber! Kein Chance das teil läuft weiter..
Minimieren und Maximmieren das alles funktioniert auch beim spielen.

gruss

himitsu 7. Apr 2011 23:51

AW: Timing problem
 
Delphi-Quellcode:
while GetTickCount < Tick + TempoWait do
  Winprocessmessages;
Warum nicht einfach
Delphi-Quellcode:
Sleep(TempoWait);
?

In einem eigenständigen Thread hättest du damit keinerlei Propleme
und eine derartige Schleife macht absolut nix anderes, außer Rechnen und ständiges Nachsehn, ob es noch was zum Rechnen gibt. (also andere Programme können da garkeine Zeit von abgekommen, eher im Gegenteil ... du verbrätst sinnlos wertvolle Rechenzeit)


Notfalls ginge es im Hauptthread auch noch so:
Delphi-Quellcode:
Tick := GetTickCount + TempoWait;
Winprocessmessages;
Dec(Tick, GetTickCount);
if Integer(Tick) > 0 then Sleep(Tick);
Wenn dein Programm aber mal viele/langwierige Messages zu verarbeiten hat, dann stockt es aber so oder so, es sei denn man versucht immer nur soviele Nachrichten zu verarbeiten, wie in TempoWait genögend Zeit finden und verschiebt den rest auf die nächsten Schleifendurchläufe.


Fazit: Es liegt ein Designfehler vor wenn du eine derartige "Zeitkritische" Aufgabe, wie deine Soundausgabe, in den unberechenbaren Hauptthread legst.

EWeiss 7. Apr 2011 23:56

AW: Timing problem
 
Weil Tick gleicht GetTickCount und TempoWait das aktuell eingestellte Tempo ist mit welchen der Song abspielt.

Delphi-Quellcode:
  Tick := GetTickCount;

  // Starte den Song
  while PlayingSong do
  begin
    //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
    while GetTickCount < Tick + TempoWait do
      Winprocessmessages;

    Tick := GetTickCount;
    PlayNotes;
    DrawGraphics(WinHandle);
    hsi.nPos := StartX + XSizeMid;
    SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
  end;
Delphi-Quellcode:
        ID_TRACK_TEMPO:
        begin
          MidiTracker.Tempo := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, ID_TRACK_TEMPO));
          TempoWait := 1000 div round((MidiTracker.Tempo / 15));
        end;
gruss

Trebxson 7. Apr 2011 23:57

AW: Timing problem
 
Was passiert denn, wenn du alles was nicht mit dem Sound zu tun hat, raus haust. Hängt es dann immer noch?

Delphi-Quellcode:
timeout := 10000;

while (PlayingSong) do
 begin
  sleep (1000);
  PlayNotes;

  timeout := timeout - 1000;
  if (timeout < 0) then
   begin
    break;
   end;
 end;
Was genau macht PlayNotes bzw. wie ist es implementiert? Packt es die Noten in einen Puffer der dann (von was?) abgespielt wird? Oder spielt es die Noten gleich ab und blockiert damit die Schleife?

Vielleicht erzeugst du auch gerade mit dem Warten das Geruckle. Ist das Ruckeln gleichmäßig?

Du solltest erst die Ursache des Ruckeln bekämpfen und dann die anderen Sachen wie Grafik, Nachrichtenbehandlung, Tempo usw. hinzufügen.

BUG 7. Apr 2011 23:58

AW: Timing problem
 
Zitat:

Zitat von himitsu (Beitrag 1093799)
Warum nicht einfach
Delphi-Quellcode:
Sleep(TempoWait);
?

In einem eigenständigen Thread hättest du damit keinerlei Propleme
und eine derartige Schleife macht absolut nix anderes, außer rechnen und ständiges Nachsehn, ob es noch was zum Rechnen gibt. (also andere Programme können da garkeine Zeit von abgekommen)

:shock: MSDN-Library durchsuchenSleep macht genau das!

Zitat:

This function causes a thread to relinquish the remainder of its time slice [...] After the sleep interval has passed, the thread is ready to run. [...] Note that a ready thread is not guaranteed to run immediately. Consequently, the thread may not run until some time after the sleep interval elapses.

himitsu 8. Apr 2011 00:05

AW: Timing problem
 
@BUG: Ich weiß das, aber er macht ja kein Sleep. :zwinker:


also mit sleep gibt es die übrige Zeit ab
Delphi-Quellcode:
// Starte den Song
Tick := GetTickCount;
while PlayingSong do
begin
  //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
  {while GetTickCount < Tick + TempoWait do
    Winprocessmessages;}
  X := TempoWait - (Integer(GetTickCount) - Tick);
  if X > 0 then Sleep(X);
  Tick := GetTickCount;

  PlayNotes;
  DrawGraphics(WinHandle);
  hsi.nPos := StartX + XSizeMid;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
end;
TempoWait und Tick sind ebenfalls Integer

EWeiss 8. Apr 2011 00:08

AW: Timing problem
 
Es läuft nicht nur der Sound sondern gleichzeitig werden intensive Grafische funktionen (Rechenoperationen) ausgeführt die
an dem Sound gekoppelt sind die kann man nicht einfach ausblenden.

Das Grid wird gezeichnet die Abtastbar überprüft im Grid die eingegebenen Instrumente und Noten
zusätzlich werden zeitgleich noch die Tasten dazu gedrückt.

das ist alles nicht so einfach.. mal ebend was auslagern da alles zur selben zeit gebraucht wird.

Ich habe es mal mit himitsu variante versucht..
Keine Chance solange der Song läuft kann ich mein Window nicht schließen.

Wenn ich mein Window verschiebe hält der Song an.

gruss

EWeiss 8. Apr 2011 00:09

AW: Timing problem
 
Zitat:

Zitat von himitsu (Beitrag 1093804)
@BUG: Ich weiß das, aber er macht ja kein Sleep. :zwinker:


also
Delphi-Quellcode:
// Starte den Song
Tick := GetTickCount;
while PlayingSong do
begin
  //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
  {while GetTickCount < Tick + TempoWait do
    Winprocessmessages;}
  X := TempoWait - (Integer(GetTickCount) - Tick);
  if X > 0 then Sleep(X);
  Tick := GetTickCount;

  PlayNotes;
  DrawGraphics(WinHandle);
  hsi.nPos := StartX + XSizeMid;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
end;
TempoWait und Tick sind ebenfalls Integer

Ich habe es gemacht ;)
Und ich glaube dir auch.
Es bringt mir keinen vorteil.

Glaube es mir :)

Ich versuche es nochmal mit deiner neuen Variante ;)

EDIT:
Nop mit deiner letzten version kann ich gar nichts mehr machen.
Kein Fenster verschieben keinen Button drücken nur noch den Taskmanager verwenden zum beenden.


gruss

Luckie 8. Apr 2011 00:10

AW: Timing problem
 
Zitat:

Zitat von EWeiss (Beitrag 1093805)
Wenn ich mein Window verschiebe hält der Song an.

Richtig weil dann dein Thread die Nachrichtenschleife abarbeitet und da stehe eben jede Menge Nachrichten zum Neuzeichnen an.

Trebxson 8. Apr 2011 00:17

AW: Timing problem
 
Ich verstehe noch nicht so ganz die Logik.

Was passiert während des Waits? (per was auch immer) Stell die Zeit doch mal extrem hoch und schau ob die Hänger gleichmäßig sind.

Ich meine es gibt ja auch halbe, ganze Noten. Ganz zu schweigen von verschiedenen Akzenten Legato oder das Gegenstück Staccato.

Vielleicht musst du am Ende die Schleife durch rennen lassen. Wenn die Funktionen gekapselt sind werden die vermutlich bald zurück kommen, wenn die nichts zu tun haben.

Ist das ein Baukasten oder hast du dir einen solchen selbst zurecht programmiert? Vielleicht gibt es Beispiele für deine Schleife.

Wer liefert die Noten? Also woher weiß "PlayNotes" welche Noten zu spielen sind?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr.
Seite 2 von 7     12 34     Letzte »    

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