Seite 1 von 2

Bild nach links scrollen

Verfasst: 20.02.2011 11:29
von Mok
Hallo!
Ich habe mir gerade ein Task-Manager-artiges Diagramm gebaut, welches eigentlich auch schon funktioniert, nur beim weiterscrollen hab ich noch Probleme, weil das Image nicht mehr angezeigt wird.

Code: Alles auswählen

EnableExplicit

OpenWindow(0,320,320,340,200,"Diagramm")
CreateImage(0,300,130,32)
ImageGadget(0,20,20,300,130,ImageID(0))
Define.l i = 290
Define.b Load, PrevLoad     ; i verringern, um mehr vom Diagramm zu sehen
AddWindowTimer(0, 1, 1000)

StartDrawing(ImageOutput(0))
Repeat
   
  Define.l Event = WaitWindowEvent()
   
  Select Event
 
    Case #PB_Event_Gadget
      If EventGadget() = 2
        ClearGadgetItems(1)
      EndIf
   
    Case #PB_Event_Timer
      If EventTimer() = 1
        FillArea(10,110,#Black,#Black)
        Load = CpuUsage()
        GrabImage (0,0,20,0,320,130) ;<---
        LineXY (i-10, 100-PrevLoad, i+10, 100-Load, RGB(10,255,5))
        DrawText(10,110,Str(Load)+" %   ",RGB(10,255,5),RGB(0,0,0))
        SetGadgetState(0,ImageID(0))
        PrevLoad = Load
        i + 20
      EndIf
  EndSelect

Until Event = #PB_Event_CloseWindow
StopDrawing()
CloseWindow(0)
End
Hat jemand einen funktionierenden Lösungsvorschlag?

Danke im Voraus,
Mok

Re: Bild nach links scrollen

Verfasst: 20.02.2011 12:45
von RSBasic
Hi Mok,


bist du immernoch an deinem Projekt?^^

Als ich letztes Jahr anfing, mein Projekt "PCInfoPoint" durchzuführen, habe ich auch ein CPU-Diagramm versucht zu erstellen.
Obwohl meine Diagrammfunktion eigentlich fast fertig war, hab ich diese noch nicht in meiner Anwendung implementiert.

Aber ich kann dir gerne mein damaliger Code posten:

Code: Alles auswählen

EnableExplicit

CreateImage(1,400,110,32)
CreateImage(2,400,110,32)

Procedure Thread(z)
  Protected LineYCounter=25
  Protected LineYCounter2
  Protected Zufall
  Protected oldZufall
  
  Repeat
    FreeImage(2)
    CopyImage(1,2)
    If StartDrawing(ImageOutput(1))
      Box(0,0,ImageWidth(1),ImageHeight(1),RGB(0,0,0))
      
      Line(ImageWidth(1)-1,5,1,1,RGB(0,100,0))
      Line(ImageWidth(1)-1,30,1,1,RGB(0,100,0))
      Line(ImageWidth(1)-1,55,1,1,RGB(0,100,0))
      Line(ImageWidth(1)-1,80,1,1,RGB(0,100,0))
      Line(ImageWidth(1)-1,105,1,1,RGB(0,100,0))
      
      
      If LineYCounter=25
        Line(ImageWidth(1)-1,5,1,100,RGB(0,100,0))
        LineYCounter=0
      Else
        LineYCounter+1
      EndIf
      
      DrawImage(ImageID(2), -1, 0)
      
      If LineYCounter2=4
        Zufall=Random(50)
        LineXY(ImageWidth(1)-5,105-oldZufall,ImageWidth(1)-1,105-Zufall,RGB(Zufall,255,0))
        LineYCounter2=0
        oldZufall=Zufall
      Else
        LineYCounter2+1
      EndIf
      
      StopDrawing()
    EndIf
    SetGadgetState(1,ImageID(1))
    
    Delay(100)
  ForEver
EndProcedure


If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ContainerGadget(2,10,10,395,110,0)
    ImageGadget(1,0,0,0,0,ImageID(1),0)
  CloseGadgetList()
  
  CreateThread(@Thread(),0)
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Da musst du eigentlich nur noch die CPU-Last einfügen und vielleicht noch etwas optimieren, dass es nicht mehr so flackert.

Re: Bild nach links scrollen

Verfasst: 20.02.2011 15:59
von Mok
:shock: Boah, geil! Vielen Dank!
Bezüglich flackern... soweit ich das sehe wird das Image ja bereits ge-'doublebuffered' und so richtig rumackern trau ich mich ehrlichgesagt nicht, weil Threading.

Edit:
[OT]
RSBasic hat geschrieben:bist du immernoch an deinem Projekt?^^
Wieder. Hab erstmal eine größere Pause eingelegt, wegen Zeitmangel. :wink:
[/OT]

Re: Bild nach links scrollen

Verfasst: 20.02.2011 16:27
von STARGÅTE
Einfach aus dem "überflüssigen" 32 BIT-Image ein 24Bit Image machen, und es flackert nicht mehr ;-)

Statt Thread, sollte man lieber n WindowTimer nutzen ... zumal es ja um eine einfache Sache geht.

Re: Bild nach links scrollen

Verfasst: 20.02.2011 16:34
von STARGÅTE
EDIT: Hier stand mal n Antwort von Mok!

Sieht für mich genauso aus ...

Code: Alles auswählen

EnableExplicit

CreateImage(1,400,110,24)
CreateImage(2,400,110,24)

Procedure Thread()
  Static LineYCounter=25
  Static LineYCounter2
  Static Zufall
  Static oldZufall
  
  FreeImage(2)
  CopyImage(1,2)
  If StartDrawing(ImageOutput(1))
  	Box(0,0,ImageWidth(1),ImageHeight(1),RGB(0,0,0))
  	
  	Line(ImageWidth(1)-1,5,1,1,RGB(0,100,0))
  	Line(ImageWidth(1)-1,30,1,1,RGB(0,100,0))
  	Line(ImageWidth(1)-1,55,1,1,RGB(0,100,0))
  	Line(ImageWidth(1)-1,80,1,1,RGB(0,100,0))
  	Line(ImageWidth(1)-1,105,1,1,RGB(0,100,0))
  	
  	
  	If LineYCounter=25
  		Line(ImageWidth(1)-1,5,1,100,RGB(0,100,0))
  		LineYCounter=0
  	Else
  		LineYCounter+1
  	EndIf
  	
  	DrawImage(ImageID(2), -1, 0)
  	
  	If LineYCounter2=4
  		Zufall=Random(50)
  		LineXY(ImageWidth(1)-5,105-oldZufall,ImageWidth(1)-1,105-Zufall,RGB(Zufall,255,0))
  		LineYCounter2=0
  		oldZufall=Zufall
  	Else
  		LineYCounter2+1
  	EndIf
  	
  	StopDrawing()
  EndIf
  SetGadgetState(1,ImageID(1))

EndProcedure


If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ContainerGadget(2,10,10,395,110,0)
    ImageGadget(1,0,0,0,0,ImageID(1),0)
  CloseGadgetList()
  
  AddWindowTimer(0, 1, 100)
  
  Repeat
  	
  	Select WaitWindowEvent()  
  		Case #PB_Event_Timer
  			If EventTimer() = 1 : Thread() : EndIf
  		Case #PB_Event_CloseWindow
  			End
  	EndSelect
  	
  ForEver 

EndIf

Re: Bild nach links scrollen

Verfasst: 20.02.2011 16:36
von Mok
STARGÅTE hat geschrieben:EDIT: Hier stand mal n Antwort von Mok!
Jo, weil man mit einem Timer auch ein flüssiges Bild machen kann.
Da waren meine Finger schneller als das Hirn.

Re: Bild nach links scrollen

Verfasst: 20.02.2011 17:21
von RSBasic
@STARGÅTE
Ah cool :allright:
Gut zu wissen, dass bei 24 Bit das Zeichnen nicht mehr flackert.
Aber warum eigentlich?

Re: Bild nach links scrollen

Verfasst: 20.02.2011 17:35
von STARGÅTE
Weil bei 24Bit 100% kein Alpha-Kanal drin ist, das heißt das neue Bild wird einfach über das alte gelegt.

Nutzt du 32 Bit, wird erst das Fenster geleert (wieder hintergrundgrau) und dann das Image neu gezeichnet.

Re: Bild nach links scrollen

Verfasst: 20.02.2011 18:04
von ts-soft
Damit der Code auch beim bewegen des Fenster funktioniert, ist für Windows eine kleine Änderung nötig.
Unter Linux ist das unnötig, da wird auf dem Timer auch beim bewegen des Fensters reagiert.

Code: Alles auswählen

EnableExplicit

CreateImage(1,400,110,24)
CreateImage(2,400,110,24)

Procedure Thread()
  Static LineYCounter=25
  Static LineYCounter2
  Static Zufall
  Static oldZufall
 
  FreeImage(2)
  CopyImage(1,2)
  If StartDrawing(ImageOutput(1))
     Box(0,0,ImageWidth(1),ImageHeight(1),RGB(0,0,0))
     
     Line(ImageWidth(1)-1,5,1,1,RGB(0,100,0))
     Line(ImageWidth(1)-1,30,1,1,RGB(0,100,0))
     Line(ImageWidth(1)-1,55,1,1,RGB(0,100,0))
     Line(ImageWidth(1)-1,80,1,1,RGB(0,100,0))
     Line(ImageWidth(1)-1,105,1,1,RGB(0,100,0))
     
     
     If LineYCounter=25
        Line(ImageWidth(1)-1,5,1,100,RGB(0,100,0))
        LineYCounter=0
     Else
        LineYCounter+1
     EndIf
     
     DrawImage(ImageID(2), -1, 0)
     
     If LineYCounter2=4
        Zufall=Random(50)
        LineXY(ImageWidth(1)-5,105-oldZufall,ImageWidth(1)-1,105-Zufall,RGB(Zufall,255,0))
        LineYCounter2=0
        oldZufall=Zufall
     Else
        LineYCounter2+1
     EndIf
     
     StopDrawing()
  EndIf
  SetGadgetState(1,ImageID(1))

EndProcedure

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Procedure TimerCB(hWnd, uMsg, idEvent, dwTime)
  If idEvent = 1
    Thread()
  EndIf
EndProcedure
CompilerEndIf

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ContainerGadget(2,10,10,395,110,0)
    ImageGadget(1,0,0,0,0,ImageID(1),0)
  CloseGadgetList()
 
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  SetTimer_(WindowID(0), 1, 100, @TimerCB())
  CompilerElse
  AddWindowTimer(0, 1, 100)
  CompilerEndIf
  Repeat
     
     Select WaitWindowEvent() 
        CompilerIf #PB_Compiler_OS <> #PB_OS_Windows
        Case #PB_Event_Timer
          If EventTimer() = 1 : Thread() : EndIf
        CompilerEndIf
        Case #PB_Event_CloseWindow
           End
     EndSelect
     
  ForEver

EndIf 

Re: Bild nach links scrollen

Verfasst: 20.02.2011 22:57
von Christian H
Beim rumspielen mit dem Code von "ts-soft" sah ich die chaotische Zufallslinie. Da kam mir der Gedanke, dass ich schon lange einen Median-Filter basteln wollte.

Code: Alles auswählen

Procedure Thread()
  Static LineYCounter=25 , LineYCounter2
  Static Zufall , oldMedian , first = #False
  Static Dim Daten(4)
  Define n
  Dim median(4)
  
  If first = #False          ;
    For n =0 To 4            ; Beim Ersten mal 
      Daten(n)=Random(100)   ; DatenArray
    Next                     ; füllen
    first = #True            ;
  EndIf                      ;
  
  FreeImage(2)
  CopyImage(1,2)
  If StartDrawing(ImageOutput(1))
    Box(0,0,ImageWidth(1),ImageHeight(1),RGB(0,0,0))
    
    Line(ImageWidth(1)-1,5,1,1,RGB(0,100,0))
    Line(ImageWidth(1)-1,30,1,1,RGB(0,100,0))
    Line(ImageWidth(1)-1,55,1,1,RGB(0,100,0))
    Line(ImageWidth(1)-1,80,1,1,RGB(0,100,0))
    Line(ImageWidth(1)-1,105,1,1,RGB(0,100,0))
    
    If LineYCounter=25
      Line(ImageWidth(1)-1,5,1,100,RGB(0,100,0))
      LineYCounter=0
    Else
      LineYCounter+1
    EndIf
    
    DrawImage(ImageID(2), -1, 0)
    
    If LineYCounter2=4
      LineYCounter2=0
      CopyArray(Daten(), median())
      SortArray(median(),#PB_Sort_Ascending) 
      
      Debug Str(Daten(0))+" "+Str(Daten(1))+" "+Str(Daten(2))+" "+Str(Daten(3))+" "+Str(Daten(4))+" | " +Str(median(0))+" "+Str(median(1))+" >"+Str(median(2))+"< "+Str(median(3))+" "+Str(median(4))+" "
            
      LineXY(ImageWidth(1)-5,105-Daten(1) ,ImageWidth(1)-1,105- Daten(2),RGB(175,0,0)) ;Ungefiltert
      ;Plot  (ImageWidth(1)-5,105-Daten(2), RGB(255,0,0))                              ;Ungefiltert
      
      LineXY(ImageWidth(1)-5,105-oldMedian,ImageWidth(1)-1,105-median(2),RGB(0,255,0)) ;Median-Filter  
      
      oldMedian = median(2)
      MoveMemory(@Daten(1), @Daten(0), 4*SizeOf(Integer))
      
      Daten(4)=Random(100)
    Else
      LineYCounter2+1
    EndIf
    
    StopDrawing()
  EndIf
  SetGadgetState(1,ImageID(1))
  
EndProcedure
Gruß Christian

PS: Meine Frau möchte, dass ich ALLE Smilies hier reinsetze :bounce: :lurk: :bluescreen: :iamwithstupid: :praise: :twisted: :evil: :oops: :lol: :o :allright: :lamer: