Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     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)

Trebxson 8. Apr 2011 01:07

AW: Timing problem
 
> EDit:
> Forte 180.00EUR Euronen .. ;)

Leider... ich habe daher auch nur die Free-Version. Aber auch in dieser kann man Fenster durch die Gegend bewegen während die Musik spielt. Ich vermute jedoch die Nutzen den Miditreiber für solche Spielchen.

Trebxson 8. Apr 2011 01:15

AW: Timing problem
 
Ach, ich sehe gerade. Du hast derzeit nur eine Spur und stellst damit eine Klaviatur dar. Ist auch eine Idee. Ich dachte erst die schwarzen und weißen Linien sind bereits die Spuren und sind nur zur optischen Kennung eingefärbt.

Was machst du wenn eine zweite Spur hinzukommen soll? Zum Beispiel ein zweites Instrument?

Dann wäre es doch praktisch, wenn es sie mal geben sollte, den Grafik- und Tonthread einfach mit anderen Parametern zu starten?

EWeiss 8. Apr 2011 01:16

AW: Timing problem
 
Jo ist schade ;)

Delphi-Quellcode:
  if PlayX > SongLength then
  begin
    PlayingSong := False;
    SKAERO_SetCTLText(SKAERO_GetMainItem(MainHandle, ID_PLAY), 'Play');
  end;
der loop wird deaktiviert wenn die Abtastleiste in DrawGraphics das Ende der Songlänge erreicht hat
die vorher mit FindEndOfSong ermittelt wurde.

So wie es aussieht komme ich nicht drumherum die Anwendung nach PostQuitMessage(0) mit Halt; zu beenden.

Das der Song anhält ist normal wenn das Fenster verschoben wird darum ja auch Winprosessmessages damit
die anderen Threads weiterarbeiten können.

gruss

EWeiss 8. Apr 2011 01:17

AW: Timing problem
 
Zitat:

Zitat von Trebxson (Beitrag 1093820)
Ach, ich sehe gerade. Du hast derzeit nur eine Spur und stellst damit eine Klaviatur dar. Ist auch eine Idee. Ich dachte erst die schwarzen und weißen Linien sind bereits die Spuren und sind nur zur optischen Kennung eingefärbt.

Was machst du wenn eine zweite Spur hinzukommen soll? Zum Beispiel ein zweites Instrument?

Dann wäre es doch praktisch, wenn es sie mal geben sollte, den Grafik- und Tonthread einfach mit anderen Parametern zu starten?

Nein ich habe 8 Spuren ;)
Jede Farbe auf den linken Bunten Button (EditButton) repräsentieren eine Spur

Und jeder kannst du ein Instrument zuordnen aus der Bank ..
Die mußt du allerdings erst füllen.

Instrument aus der Bank auswählen Shift drücken und dann einen der Speicherplätze anklicken.
Danach ist das Instrument gespeichert.

gruss

Trebxson 8. Apr 2011 01:24

AW: Timing problem
 
Delphi-Quellcode:
procedure WinProcessMessages;
var
  ProcMsg: TMsg;
begin
  while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do
  begin
    if (ProcMsg.message = WM_QUIT) then
      Exit;
    TranslateMessage(ProcMsg);
    DispatchMessage(ProcMsg);
  end;
end;

  // Starte den Song
  while PlayingSong do
  begin
    //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
    while GetTickCount < Tick + TempoWait do
      Winprocessmessages;
  ...
Mit exit beendest du ja auch nur die Ausführung der Funktion. Die while PlayingSong do-Schleife wertet das Ergebnis der Nachrichtenbehandlung nicht aus. D.h. die rennt ungestört weiter...
Rückgabewert? Oder gleich ein PlayingSong := false? kA welche Sichtbarkeit deine Variablen haben.

Nebenbei: Was passiert überhaupt wenn deine Anwendung Musik abspielt und etwas anderes (viel anderes bei Mehrkern) lastet dein System übermäßig aus?

Achso, ich mach dann erstmal Feierabend ;) 8 Spuren? Du überrascht schon wieder...

Und noch was weil ich es gerade sehe... du solltest solche Sachen wie DrawGraphics(WinHandle); nicht während des Herunterfahren der Anwendung ausführen. Und Halt wird dir vermutlich Speicherlecks bescheren...

EWeiss 8. Apr 2011 01:28

AW: Timing problem
 
Nein die rennt nicht ungestört weiter die beendet wenn die letzte note gespielt wurde.

Delphi-Quellcode:
procedure TMidiTracker.PlaySong(WinHandle: HWND);
var
  IntA: integer;

begin
  // Verschieb den Grid Ausschnitt wenn die Rote Laufleiste nicht
  // auf dem Grid sichtbar ist
  if (ColumnX < StartX) or (ColumnX > StartX + XSize) then
  begin
    StartX := ColumnX;
    EndX  := StartX + XSize;

    if StartX > 999 - XSize then
    begin
      StartX := 999 - XSize;
      EndX  := 999;
    end;
  end;

  // Starte das Spielen von der roten Laufleisten position
  PlayX := ColumnX;
  GetColumn(WinHandle, StartX);
  hsi.nPos    := StartX + XSizeMid;
  HasStarted  := False;
  JustScrolled := False;

  DrawGrid(WinHandle);

  // Reset die alte Note und die alte Instrumenten Variablen
  for IntA := 0 to 7 do
  begin
    OldNote[IntA] := -1;
    OldInst[IntA] := -1;
  end;

  // Nach dem Ende des Songs suchen
  FindEndOfSong;

  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;

  // Warte auf die Beendigung der Wiedergabe von der letzten 16.tel Note
  while GetTickCount < Tick + TempoWait do
    Winprocessmessages;

  // Alle Noten Stoppen
  for IntA := 0 to 7 do
  begin
    if SKAERO_GetCheckButtonStatus(SKAERO_GetMainItem(MainHandle,
      IntA + ID_HIDETRACK_FIRST)) = False then
    begin
      channel := IntA;
      if OldNote[IntA] > -1 then
        FlipStopNote(OldNote[IntA] mod 1000);
    end;
  end;

  hsi.nPos := 0;
  hsi.nTrackPos := 0;
  StartX := 0;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
  DrawGrid(WinHandle);

end;
Das funktioniert und arbeite einwandfrei nach dem ich auf den Stop Button klicke
oder der Song zu ende ist.

gruss

Trebxson 8. Apr 2011 01:36

AW: Timing problem
 
> Nein die rennt nicht ungestört weiter die beendet wenn die letzte note gespielt wurde.

Es ging doch aber ums Beenden der Anwendung (während gespielt wird) ;) Nacht!

EWeiss 8. Apr 2011 01:37

AW: Timing problem
 
Zitat:

nicht während des Herunterfahren der Anwendung ausführen. Und Halt wird dir vermutlich Speicherlecks bescheren...
Darum geht es doch ;)
Wie soll ich das verhindern wenn ich nicht rechtzeitig bzw.. den loop beenden kann
bevor ich die Anwendung Herunterfahre.

Genau das ist mein Problem das meine Anwendung hängt und ich sie nicht beenden kann.


Zitat:

Es ging doch aber ums Beenden der Anwendung (während gespielt wird) Nacht!
Korrekt .. ;) Nacht!

gruss

himitsu 8. Apr 2011 06:41

AW: Timing problem
 
Zitat:

Zitat von Luckie (Beitrag 1093807)
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.

Diese werden doch alle abgearbeitet? (direkt vor der kurzen Pause)

Da alles im Hauptthread abläuft, kann wärend der Zeit der Schleife Pause vom Programm auch keine neue Nachricht erzeugt werden.
Und Benutzereingaben des Benutzers werden innerhalb von maximal 62 Millisekunden abgehandelt. Für den Benutzer sollte diese Verzögerung fast garnicht auffallen.

:gruebel:

Namenloser 8. Apr 2011 09:15

AW: Timing problem
 
Zitat:

Zitat von EWeiss (Beitrag 1093795)
Zitat:

Zitat von NamenLozer (Beitrag 1093787)
Du könntest mal die Delay-Funktion(en) aus der CodeLib probieren, wobei du erstere natürlich auf NonVCL umschreiben musst, was aber kein großes Problem sein sollte.

Ob das Timing präzise genug ist, um Musik damit abzuspielen, musst du ausprobieren.

Delphi-Quellcode:
procedure Delay(msecs: Longint);
var
  targettime: Longint;
  Msg: TMsg;
begin
  targettime := GetTickCount + msecs;
  while targettime > GetTickCount do
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      if Msg.message = WM_QUIT then
      begin
        PostQuitMessage(Msg.wParam);
        Break;
      end;
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;
Macht fast genau das gleiche wie ich es eh schon verwende ;)

gruss

Hagens Variante aber nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.
Seite 4 von 7   « Erste     234 56     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