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 Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Timing problem

  Alt 7. Apr 2011, 23:12
Windows hat ein präemtives Multitasking System implementiert. Das heißt Windows teil den Threads Rechenzeit zu und entzieht sie ihnen auch wieder. Dadurch dass die Zeitscheiben, die ein Thread zur Nutzung der CPU zustehen, kurz gehalten sind, entsteht der Eindruck, dass Threads parallel laufen. Dabei ist für jeden Thread die Zeitscheibe gleich groß. Über das Setzen der Priorität kann man jetzt beeinflussen, wie oft ein Thread eine Zeitscheibe zugeteilt bekommt. Das nur mal zum Verständnis.

Du verursachst das Stcoken selber. Mit deinem Aufruf von ProcessMessages veranlasst du den Thread dazu die Schleife zu unterbrechen und Nachrichten aus der Nachrichtenschlange mit der Nachrichtenschleife abzuholen und zu verarbeiten. Ruf ProcessMessages nur alle 10 oder 100 oder 500 Schleifendurchläufe auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Timing problem

  Alt 7. Apr 2011, 23:32
Zitat:
Du verursachst das Stcoken selber. Mit deinem Aufruf von ProcessMessages veranlasst du den Thread dazu die Schleife zu unterbrechen und Nachrichten aus der Nachrichtenschlange mit der Nachrichtenschleife abzuholen und zu verarbeiten. Ruf ProcessMessages nur alle 10 oder 100 oder 500 Schleifendurchläufe auf.
Ja ist mir klar weil halt die anderen Prozesse auch ihren Zeitraum benötigen um ihre Arbeit abzuschließen.
Es ist definitiv so wenn ich die Schleife belasse kann ich selbst mit Winprocessmessages die Anwendung nicht mehr schließen.

Selbst eine PostQuitMessage(0) schafft es nicht diesen Loop zu Unterbrechen.
Ich muss quasi das Lied erst über den Button beenden wenn ich die Anwendung schließen will.

Das war mit eines der probleme warum ich das Timing problem angesprochen habe.

Ob es mit dem Multimediatimer funktioniert müßte ich mal versuchen.
Denke aber das er letztendlich auch nicht schneller ist wie der loop selbst.

Könnte mir aber mehr zeit lassen für andere dinge anstelle von Winprocessmessages.
Wobei die Frage ist ob dieser nicht das gleiche macht um anderen Prozessen Zeit zu verschaffen.

gruss

Geändert von EWeiss ( 7. Apr 2011 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Timing problem

  Alt 7. Apr 2011, 23:39
Ja ist mir klar weil halt die anderen Prozesse auch ihren Zeitraum benötigen um ihre Arbeit abzuschließen.
Nein! Mit dem Aufruf von ProcessMessages gibst du anderen Prozessen KEINE Rechenzeit. Du veranlasst nur deinen eigenen Thread dazu die anstehenden Nachrichten abzuarbeiten.

Und wie unterbricht die Schaltfläche die Schleife? Dann ruf den Code doch vor dem Schließen auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Timing problem

  Alt 7. Apr 2011, 23:48
Ja ist mir klar weil halt die anderen Prozesse auch ihren Zeitraum benötigen um ihre Arbeit abzuschließen.
Nein! Mit dem Aufruf von ProcessMessages gibst du anderen Prozessen KEINE Rechenzeit. Du veranlasst nur deinen eigenen Thread dazu die anstehenden Nachrichten abzuarbeiten.

Und wie unterbricht die Schaltfläche die Schleife? Dann ruf den Code doch vor dem Schließen auf.
Das geht nicht habe ich versucht.
Die Messagen laufen den Loop davon.
Was ich meine ist das sie ausgeführt werden bevor der Loop beendet wird.
Denke die zeit ist einfach zu kurz.

Ich habe ja ne BOOL Variable
 while PlayingSong do Habe meine Proc so umgeschrieben das wenn man auf den Beenden Knopf clickt
erst WM_QUIT aufgerufen wird.. dort habe ich dann veranlaßt das diese auf False gestellt wird.
Nach dem WM_QUIT noch ein WM_DESTROY und anschlie0end in der HauptAnwendung selbst PostQuitMessage(0) damit alles sauber beendet werden kann.

Aber! Kein Chance das teil läuft weiter..
Minimieren und Maximmieren das alles funktioniert auch beim spielen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#5

AW: Timing problem

  Alt 7. Apr 2011, 23:51
Delphi-Quellcode:
while GetTickCount < Tick + TempoWait do
  Winprocessmessages;
Warum nicht einfach Sleep(TempoWait); ?

In einem eigenständigen Thread hättest du damit keinerlei Propleme
und eine derartige Schleife macht absolut nix anderes, außer Rechnen und ständiges Nachsehn, ob es noch was zum Rechnen gibt. (also andere Programme können da garkeine Zeit von abgekommen, eher im Gegenteil ... du verbrätst sinnlos wertvolle Rechenzeit)


Notfalls ginge es im Hauptthread auch noch so:
Delphi-Quellcode:
Tick := GetTickCount + TempoWait;
Winprocessmessages;
Dec(Tick, GetTickCount);
if Integer(Tick) > 0 then Sleep(Tick);
Wenn dein Programm aber mal viele/langwierige Messages zu verarbeiten hat, dann stockt es aber so oder so, es sei denn man versucht immer nur soviele Nachrichten zu verarbeiten, wie in TempoWait genögend Zeit finden und verschiebt den rest auf die nächsten Schleifendurchläufe.


Fazit: Es liegt ein Designfehler vor wenn du eine derartige "Zeitkritische" Aufgabe, wie deine Soundausgabe, in den unberechenbaren Hauptthread legst.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Apr 2011 um 23:54 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Timing problem

  Alt 7. Apr 2011, 23:56
Weil Tick gleicht GetTickCount und TempoWait das aktuell eingestellte Tempo ist mit welchen der Song abspielt.

Delphi-Quellcode:
  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;
Delphi-Quellcode:
        ID_TRACK_TEMPO:
        begin
          MidiTracker.Tempo := SKAERO_GetTrackValue(SKAERO_GetMainItem(MainHandle, ID_TRACK_TEMPO));
          TempoWait := 1000 div round((MidiTracker.Tempo / 15));
        end;
gruss
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Timing problem

  Alt 7. Apr 2011, 23:58
Warum nicht einfach Sleep(TempoWait); ?

In einem eigenständigen Thread hättest du damit keinerlei Propleme
und eine derartige Schleife macht absolut nix anderes, außer rechnen und ständiges Nachsehn, ob es noch was zum Rechnen gibt. (also andere Programme können da garkeine Zeit von abgekommen)
MSDN-Library durchsuchenSleep macht genau das!

Zitat:
This function causes a thread to relinquish the remainder of its time slice [...] After the sleep interval has passed, the thread is ready to run. [...] Note that a ready thread is not guaranteed to run immediately. Consequently, the thread may not run until some time after the sleep interval elapses.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#8

AW: Timing problem

  Alt 8. Apr 2011, 00:05
@BUG: Ich weiß das, aber er macht ja kein Sleep.


also mit sleep gibt es die übrige Zeit ab
Delphi-Quellcode:
// Starte den Song
Tick := GetTickCount;
while PlayingSong do
begin
  //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
  {while GetTickCount < Tick + TempoWait do
    Winprocessmessages;}

  X := TempoWait - (Integer(GetTickCount) - Tick);
  if X > 0 then Sleep(X);
  Tick := GetTickCount;

  PlayNotes;
  DrawGraphics(WinHandle);
  hsi.nPos := StartX + XSizeMid;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
end;
TempoWait und Tick sind ebenfalls Integer
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Apr 2011 um 00:09 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Timing problem

  Alt 8. Apr 2011, 00:09
@BUG: Ich weiß das, aber er macht ja kein Sleep.


also
Delphi-Quellcode:
// Starte den Song
Tick := GetTickCount;
while PlayingSong do
begin
  //Weiterlaufen bis die 16.tel Note (Pause) abgelaufen ist
  {while GetTickCount < Tick + TempoWait do
    Winprocessmessages;}

  X := TempoWait - (Integer(GetTickCount) - Tick);
  if X > 0 then Sleep(X);
  Tick := GetTickCount;

  PlayNotes;
  DrawGraphics(WinHandle);
  hsi.nPos := StartX + XSizeMid;
  SetScrollInfo(WinHandle, SB_HORZ, hsi, True);
end;
TempoWait und Tick sind ebenfalls Integer
Ich habe es gemacht
Und ich glaube dir auch.
Es bringt mir keinen vorteil.

Glaube es mir

Ich versuche es nochmal mit deiner neuen Variante

EDIT:
Nop mit deiner letzten version kann ich gar nichts mehr machen.
Kein Fenster verschieben keinen Button drücken nur noch den Taskmanager verwenden zum beenden.


gruss

Geändert von EWeiss ( 8. Apr 2011 um 00:13 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Timing problem

  Alt 8. Apr 2011, 00:08
Es läuft nicht nur der Sound sondern gleichzeitig werden intensive Grafische funktionen (Rechenoperationen) ausgeführt die
an dem Sound gekoppelt sind die kann man nicht einfach ausblenden.

Das Grid wird gezeichnet die Abtastbar überprüft im Grid die eingegebenen Instrumente und Noten
zusätzlich werden zeitgleich noch die Tasten dazu gedrückt.

das ist alles nicht so einfach.. mal ebend was auslagern da alles zur selben zeit gebraucht wird.

Ich habe es mal mit himitsu variante versucht..
Keine Chance solange der Song läuft kann ich mein Window nicht schließen.

Wenn ich mein Window verschiebe hält der Song an.

gruss
  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 19:49 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