![]() |
AW: Timing problem
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 |
AW: Timing problem
Der (wichtige) Unterschied ist: Hagens Procedure nutzt
Delphi-Quellcode:
, sodass die Anwendung schläft, solange nicht eine Input-Message hereinkommt oder die Wartezeit überschritten wird. Deshalb verbraucht sie deutlich weniger Ressourcen:
MsgWaitForMultipleObjects
Delphi-Quellcode:
Eigentlich musst du nur
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;
Delphi-Quellcode:
durch deine eigene Message-Abarbeitungsroutine ersetzen...
Application.ProcessMessages;
|
AW: Timing problem
Du meinst also quasi
Anstelle von Winprocessmessages
Delphi-Quellcode:
verwenden und damit über meine Winprocessmessage gehen..
Delay(Milliseconds: Integer);
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 |
AW: Timing problem
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 ;) |
AW: Timing problem
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 |
AW: Timing problem
Zitat:
![]() |
AW: Timing problem
Zitat:
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.dll' name 'SetWaitableTimer'; Zitat:
Denke damit kann ich leben .. Bei normalen Grafik Operationen sind es 0% Zitat:
Macht es dann Sinn den Quelltext noch hochzuladen ? gruss |
AW: Timing problem
hab mich vielleicht blöd ausgedrückt: unabhängig von nonVCL oder VCl bitte. Nur im Prinzip!
Delphi-Quellcode:
Ich weiss es ist nicht so einfach wie oben geschrieben, ist ja nur ne Überlegung.
TForm1.Timer1Timer(sender: Tobject)
begin if Playsong then begin PlayNotes;//<--wobei das evtl hier im Timer nicht wichtig ist? DrawGraphics(WinHandle); hsi.nPos := StartX + XSizeMid; SetScrollInfo(WinHandle, SB_HORZ, hsi, True); end; end; Worauf soll Dein Timer warten? WEnn ich dich richtig verstehe geht es darum Die note/Pause abzuspielen, dabei gleichzeitig die graphik zu aktuallisieren. Zumal die Aktuallisierung der Graphic ja nur vom Tempo wichtig ist. Ob Du da 8tel 16tel oder 32tel darstellen tust ist der Graphic egal. Wichtig ist die sychronisation! Also evtl trennen, siehe im Timer! alfold |
AW: Timing problem
Zitat:
Wie kommst du darauf das es nicht wichtig sein soll ? Ohne dem Spielt einfach kein Ton. Der Grafik ist das nicht egal denn das Grid verwaltet nun mal die noten Und diese werden eingelesen abhängig von den Balken (Abtastbar) wie lange sie sich über einer Noten befindet. Und die kann ganz lang sein. Also eine kombination zwichen Grafik Timing und der länge der noten (was wiederum mit dem Timing zu tun hat). Werde es nachher mal mit meinem Timer versuchen der auf die Events wartet. gruss |
AW: Timing problem
Missvertändniss! Playnotes meine ich im Timer evtl überflüssig! Weil Du damit nur "die Melodie" spielst, hat aber mit der Anzeige im eigentlichen nichts zu tun:wink:
Denn abspielen kannst Du auch ohne graphic das meint ich damit! alfold |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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