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
EWeiss
(Gast)

n/a Beiträge
 
#1

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
 
#2

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
 
#3

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
 
#4

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
 
#5

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
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 10:58 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