Bild nach links scrollen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Bild nach links scrollen

Beitrag 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
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bild nach links scrollen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Bild nach links scrollen

Beitrag 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]
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bild nach links scrollen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bild nach links scrollen

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Bild nach links scrollen

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bild nach links scrollen

Beitrag von RSBasic »

@STARGÅTE
Ah cool :allright:
Gut zu wissen, dass bei 24 Bit das Zeichnen nicht mehr flackert.
Aber warum eigentlich?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bild nach links scrollen

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Bild nach links scrollen

Beitrag 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 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: Bild nach links scrollen

Beitrag 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:
Antworten