Seite 2 von 2

Re: Event aussetzen?

Verfasst: 16.08.2010 23:38
von super_castle
Hmmm..., danke.

Kannst du das mal erklären mit deinem Befehlen?

Gruss

Re: Event aussetzen?

Verfasst: 16.08.2010 23:51
von Jilocasin
Klar, wieso nicht.

Das alles basiert auf einem "high-resolution performance counter", der vom Betriebssystem bzw. der verwendeten Hardware zur Verfügung gestellt wird. Im Grunde funktioniert es in derselben Art, wie deine Lösung mit dem ElapsedMilliseconds().

QueryPerformanceCounter_() wäre hierbei das Equivalent zu ElapsedMilliseconds(). Da aber unter verschiedenen Systemen die einzelnen "Ticks" des Timers unterschiedlich lang sind, gibt es QueryPerformanceFrequency_(), womit du die Anzahl der "Ticks" pro Sekunde erfährst. Deshalb teile ich die Differenz der beiden Zeiten durch die Frequenz und komme somit auf den echten Zeitunterschied.

Alles andere ist im Grunde geblieben, wie du es programmiert hast, bis auf die Goto's, welche nun mittels Break die "große" While-Schleife verlassen (statt deinem Goto ende).
Dein Goto gehe wurde außerdem in ein zweites While verpackt. :)

Re: Event aussetzen?

Verfasst: 17.08.2010 09:00
von super_castle
Ups...hier kommt : Division durch null verboten
Debug "Geschätzt " + StrD(1 / (pixelz * pixelz) * TotalTime, 4) + " pro Sekunde"

Wenn ich hier mit spiele, ändert sich der Zeitablauf nicht:
pixelz = 1.0 / 32000.0
Es rast immer durch , auch wenn ich pixelz verändere.

Code: Alles auswählen

Global *DC.l,*datspeicher.l,datlaenge.l,xs.l,ys.l,xd.l,yd.l,lauf.l,geladen.l
Global text1.s,text2.s,farbe.c

Define.q frequenz, zeita, zeite
Define.f pixelz, TotalTime
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
  
Declare erstelle_bild()
Declare lade_datei()

Enumeration
  #Window_0
  #Button_0
  #Button_1
  #String_0
  #Editor_0
EndEnumeration

Macro HiWord(long)
  (long >> 16) & $FFFF
EndMacro

Macro LoWord(long)
  long & $FFFF
EndMacro

Procedure lade_datei()
  geladen=0
  If ReadFile(0, text1+".wav")
    datlaenge    = Lof(0)
    *datspeicher = AllocateMemory(datlaenge)   
    ReadData(0, *datspeicher, datlaenge) 
  Else
    ProcedureReturn 0
  EndIf
  CloseFile(0)
  geladen=1
EndProcedure

Procedure erstelle_bild()
  anfang:
  While xs => 0
    If QueryPerformanceFrequency_(@frequenz)
      While ys => 0
        QueryPerformanceCounter_(@zeita)
   
        lauf = lauf + 1
        If lauf => datlaenge
          Break
        EndIf
        ys = ys - 1
        farbe = PeekB(*datspeicher + lauf)
        SetPixel_(*DC, xd + xs, yd + ys, RGB(farbe, farbe, farbe))
   
        QueryPerformanceCounter_(@zeite)
        TotalTime = (zeite - zeita) / frequenz
   
        While TotalTime < pixelz
          QueryPerformanceCounter_(@zeite)
          TotalTime = (zeite - zeita) / frequenz
        Wend
   
        Debug "Geschätzt " + StrD(1 / (pixelz * pixelz) * TotalTime, 4) + " pro Sekunde"
      Wend
    Else
      Debug "Ups.. leider keinen high-resolution performance counter gefunden"
    EndIf
    ys=80
    xs=xs-1
  Wend
  ys=80
  xs=31
  Goto anfang
  ende:
  lauf=55
EndProcedure

OpenWindow(#Window_0, 400, 150, 800,500, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)

ButtonGadget(#Button_0, 10,10, 80, 25, "Datei laden")
ButtonGadget(#Button_1, 10,40, 80, 25, "Bild erstellen")
StringGadget(#String_0, 10, 100, 100, 20, "")
EditorGadget(#Editor_0, 10, 150, 200,300)

lauf=55
xs=31
ys=80
xd=250
yd=50
pixelz = 1.0 / 32000.0

Repeat
  
  Event = WaitWindowEvent()
  *DC = GetDC_(WindowID(#Window_0))     
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget = #Button_0  
        text1=GetGadgetText(#String_0) 
        lade_datei()
        If geladen=1
          text2+"...geladen :"+" "+Str(datlaenge)+" Byte"+Chr(10)
          SetGadgetText(#Editor_0, text2)
        Else
          text2+"...fehler"+Chr(10)
          SetGadgetText(#Editor_0, text2)
        EndIf  
      EndIf
      
      If EventGadget = #Button_1 
        If geladen=1
          erstelle_bild() 
        EndIf  
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
  
  ReleaseDC_(WindowID(0), *DC) 
   
ForEver


Gruss

Re: Event aussetzen?

Verfasst: 17.08.2010 12:44
von bobobo
GLOBAL statt DEFINE könnte helfen

Re: Event aussetzen?

Verfasst: 17.08.2010 14:43
von super_castle
QueryPerformanceFrequency_(), womit du die Anzahl der "Ticks" pro Sekunde erfährst.
Reicht es wenn man das einmal aufruft am Programmanfang, oder muss es bei jeder Messung neu aufgerufen werden?

Gruss

Re: Event aussetzen?

Verfasst: 17.08.2010 15:28
von c4s
super_castle hat geschrieben:Reicht es wenn man das einmal aufruft am Programmanfang, oder muss es bei jeder Messung neu aufgerufen werden?
Ja.

Re: Event aussetzen?

Verfasst: 17.08.2010 17:47
von bobobo

Re: Event aussetzen?

Verfasst: 17.08.2010 18:07
von super_castle
Jup, danke für den Hinweis.