AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timing problem

Ein Thema von EWeiss · begonnen am 7. Apr 2011 · letzter Beitrag vom 8. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Timing problem

  Alt 8. Apr 2011, 00:52
Verarbeitest du auch Eingabegeräte? Soweit ich gelesen habe haben die bei der Echtzeitverarbeitung von Musik die gleichen Probleme.

Meiner Meinung nach Schreit das nach einen Thread pro Aufgabe.

Ein Thread für das Formular und Nachrichtenbehandlung.
Einer für die Grafik womit das Formular gefüttert wird (auch wenn du Fenster bewegst).
Und einer für den Ton.

Sagt dir Lugert Verlag Forte etwas? Das macht genau das was du versucht umzusetzen. Nur mit einfacher Grafik.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Timing problem

  Alt 8. Apr 2011, 00:55
Verarbeitest du auch Eingabegeräte? Soweit ich gelesen habe haben die bei der Echtzeitverarbeitung von Musik die gleichen Probleme.

Meiner Meinung nach Schreit das nach einen Thread pro Aufgabe.

Ein Thread für das Formular und Nachrichtenbehandlung.
Einer für die Grafik womit das Formular gefüttert wird (auch wenn du Fenster bewegst).
Und einer für den Ton.

Sagt dir Lugert Verlag Forte etwas? Das macht genau das was du versucht umzusetzen. Nur mit einfacher Grafik.
lade dir doch einfach mal das Virtual Piano herunter (Projekte der Forummitglieder)
wenn du sehen willst was ich da mache.

Eingabegeräte verwende ich keine.

EDit:
Forte 180.00EUR Euronen ..

gruss

Geändert von EWeiss ( 8. Apr 2011 um 01:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Timing problem

  Alt 8. Apr 2011, 01:05
> Eingabegeräte verwende ich keine.

Schade

D.h. PlayNotes startet nur, aber wartet nicht auf das Ende der Note.

Die Nachrichtenbehandlung wirst du für den Empfang von CloseQueries usw. schon brauchen. Nur solltest du das mit dem Sleep () kombinieren um deinen Wunsch nach weniger Auslastung gerecht zu werden.

Ich habe die Erfahrung gemacht, wenn im Formular z.B. ein Button gedrückt wird der in eine Schleife rennt, wird für die Dauer die zweite Schleife im selben Thread nicht weiter ausgeführt (ist auch irgendwie logisch). Daher wirst du nichts anderes erwarten können, wenn du das Fenster durch die Gegend schiebst, dass die Musik stoppt.

Mit dem Beispielcode wollte ich übrigens auch nur wissen ob die übrigen Anweisungen hängen.

Das sind so die Probleme die ich bisher erlesen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Timing problem

  Alt 8. Apr 2011, 01:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Timing problem

  Alt 8. Apr 2011, 01:24
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...

Geändert von Trebxson ( 8. Apr 2011 um 01:30 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Timing problem

  Alt 8. Apr 2011, 01:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Timing problem

  Alt 8. Apr 2011, 01:36
> 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!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Timing problem

  Alt 8. Apr 2011, 01:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Timing problem

  Alt 8. Apr 2011, 01:07
> 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.
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Timing problem

  Alt 8. Apr 2011, 01:15
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:04 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