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 7. Apr 2011, 23:38
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Timing problem

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

n/a Beiträge
 
#3

AW: Timing problem

  Alt 8. Apr 2011, 11:08
Auf den ersten Bilck schon..
wenn dann würde ich eh meinen WaitableTimer verwenden
damit wäre es möglich solange zu warten bis der Loop nach dem übermitteln PlayingSong = False
abgearbeitet ist.

Aber dazu müßte ich einen Thread erstellen was nicht so einfach ist da viel Faktoren hier eine Rolle spielen.

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Timing problem

  Alt 8. Apr 2011, 11:33
Der (wichtige) Unterschied ist: Hagens Procedure nutzt MsgWaitForMultipleObjects , sodass die Anwendung schläft, solange nicht eine Input-Message hereinkommt oder die Wartezeit überschritten wird. Deshalb verbraucht sie deutlich weniger Ressourcen:
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWord;
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, nil);
  try
    Tick := GetTickCount + DWord(Milliseconds);
    while (Milliseconds > 0) and
          (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Exit;
      Milliseconds := Tick - GetTickcount;
    end;
  finally
    CloseHandle(Event);
  end;
end;
Eigentlich musst du nur Application.ProcessMessages; durch deine eigene Message-Abarbeitungsroutine ersetzen...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Timing problem

  Alt 8. Apr 2011, 12:00
Du meinst also quasi
Anstelle von Winprocessmessages
Delay(Milliseconds: Integer); verwenden und damit über meine Winprocessmessage gehen..

Soweit habe ich das verstanden.
Nur was für einen Sinn macht das wenn ich beisp. den Song abspiele und dann
Delay(1000) also eine sekunde warten lasse.

Dann tut sich ja auf meinem ganzen Window nix mehr oder?

Aber wenn es was bringt um das Timing problem zu beseitigen kann ich es ja mal versuchen.

Mein Bedenken ist nur wenn sich der Loop gerade zu der Zeit
wo ich die Anwendung beende in Drawgraphics befinde hat auch das Delay zu der Zeit keine Funktion
und kann nicht eingreifen und genau dort das abspielen des Songs beenden.

Also wird sich das Window genausowenig schließen lassen.

EDIT:
Im moment ist es so das kein Interesse mehr an meinem Projekt besteht
Also Download = 0 und das obwohl jetzt fast alles fertig ist.
Sonst hätte ich den Source schon hochgeladen.
Nur was macht das für einen Sinn wenn es niemanden mehr Interessiert.


gruss

Geändert von EWeiss ( 8. Apr 2011 um 12:08 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Timing problem

  Alt 8. Apr 2011, 14:44
Ich weiß nicht, wie dein PlayNotes aussieht. Ich dachte nur, wenn da z.B. eine Note ist, die für 1 Sekunde spielt, dann kann das Programm 1 Sekunde schlafen, bis es die nächste Note abspielt. So wäre das zumindest, wenn du MIDI zum Abspielen verwendest. Wie das auf dein konktretes Programm anzuwenden ist, sprich, wo es sich eine Pause gönnen kann, musst du wissen.

Wenn dein Programm tatsächlich permanent etwas tut, dann wirst du auch nicht um die 100% CPU-Auslastung herumkommen...

PS: Ich werde dein Programm erst dann wieder runterladen, wenn Grund zur Annahme besteht, dass das Problem, das bei mir den Start verhindert, behoben ist
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Timing problem

  Alt 8. Apr 2011, 14:47
Ich weiss es ist nonVcl! Vom Prinzip her nichts anderes!
Aber warum machst du es Dir selber schwerer als es sein muss?
In VCL würde ich einen Timer nehmen und dann nicht while benutzen sondern
If songplay then usw.
Vorteil liegt klar auf der Hand, Du hast keine while schleife in der Du nun festhängst!
CPU last würde damit auch nach unten gehen.
Wie man einen Timer in nonVCL schreibt mh.. muss ich passen.

Soll ja auch nur als Anregung dienen!

alfold
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Timing problem

  Alt 8. Apr 2011, 15:01
Wie man einen Timer in nonVCL schreibt mh.. muss ich passen.
Das ist recht überschaubar: http://msdn.microsoft.com/de-de/library/ee503884.aspx
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Timing problem

  Alt 8. Apr 2011, 15:02
Ich weiss es ist nonVcl! Vom Prinzip her nichts anderes!
Aber warum machst du es Dir selber schwerer als es sein muss?
In VCL würde ich einen Timer nehmen und dann nicht while benutzen sondern
If songplay then usw.
Vorteil liegt klar auf der Hand, Du hast keine while schleife in der Du nun festhängst!
CPU last würde damit auch nach unten gehen.
Wie man einen Timer in nonVCL schreibt mh.. muss ich passen.

Soll ja auch nur als Anregung dienen!

alfold
Ich habe kein Problem einen Timer zu erstellen das sind zwei Zeilen
SetTimer und KillTimer das ist alles.

Das problem ist aber nicht der Timer selbst sondern er muss auch warten wenn eine andere Aktion ausgeführt wird.
Das soll er auch .. Aber das geht nur über einen eigenen Thread bzw einer Callback.

Ich habe meinen Timer und der wartet auch..
Muss mal sehen ob ich damit bessere Karten habe.

Delphi-Quellcode:
function MySetWaitableTimer(hTimer: THandle;
                            var lpDueTime: TLargeInteger;
                            lPeriod: longint;
                            pfnCompletionRoutine: TFNTimerAPCRoutine;
                            lpArgToCompletionRoutine: Pointer;
                            fResume: BOOL): BOOL;
                            stdcall; external 'kernel32.dllname 'SetWaitableTimer';

Zitat:
Wenn dein Programm tatsächlich permanent etwas tut, dann wirst du auch nicht um die 100% CPU-Auslastung herumkommen...
Na ja hab 25% aber dann ackert er auch..
Denke damit kann ich leben ..

Bei normalen Grafik Operationen sind es 0%

Zitat:
PS: Ich werde dein Programm erst dann wieder runterladen, wenn Grund zur Annahme besteht,
dass das Problem, das bei mir den Start verhindert, behoben ist
Kann ich ganz und voll verstehen nur wie soll ich das beheben wenn der Download gleich 0 ist.
Macht es dann Sinn den Quelltext noch hochzuladen ?

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 06:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz