ListViewGadget-Flimmern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

ListViewGadget-Flimmern

Beitrag von 7x7 »

Hallo Leute,

wie kann ich verhindern, dass das ListViewGadget() so flimmert? Das re-Paint des Gadget's wäre ja gar nicht notwendig, weil ja immer nur auf der gleichen Stelle die Ausgabe erfolgt.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ListViewGadget(0, 10, 10, 450, 320)
	For a = 1 To 10
		AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
	Next
	
	Repeat 
		SetGadgetItemText(0, 9, "Jetzt flimmerts aber mächtig!")		
	Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: ListViewGadget-Flimmern

Beitrag von Bisonte »

Das flimmern ist logisch. Du erzeugst mit dem SetGadgetText ein Event. Daher steht die schleife nie still....

Wenn du in "periodischen" Abständen das Gadget aktualisieren willst, nutze dafür lieber einen Timer.

z.B.

Code: Alles auswählen

 If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListViewGadget(0, 10, 10, 450, 320)
   For a = 1 To 10
      AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
   Next
   
   AddWindowTimer(0, 123, 500)
   
   Repeat
     Event = WaitWindowEvent()
     
     If Event = #PB_Event_Timer
       If EventTimer() = 123
         SetGadgetItemText(0, 9, "Jetzt flimmerts nicht mehr so dolle!")
       EndIf
     EndIf
     
   Until Event = #PB_Event_CloseWindow
EndIf 
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: ListViewGadget-Flimmern

Beitrag von matbal »

@Bisonte

Ganz schlüssig ist deine Begründung nicht. Es wird ja eigentlich nur eine Zeile neu geschrieben.

Macht man das gleiche mit dem ListIconGadget, so flimmert es bei mir nicht.
Ich habe nur einen Zähler hinzugefügt, damit man sieht, daß der Text ständig neu gesetzt wird.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListIconGadget(0, 10, 10, 450, 320, "Info", 400)
   For a = 1 To 10
      AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
   Next
   
   Repeat 
      i + 1
      SetGadgetItemText(0, 9, "Jetzt flimmerts aber mächtig! " + Str(i))      
   Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
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: ListViewGadget-Flimmern

Beitrag von ts-soft »

Ich weiß nicht, was an der Erklärung nicht schlüssig sein soll.

Niemals Code im EventLoop ausserhalb eines Events! Das sind Windows-Grundlagen,
und SetGadgetItemText() befindet sich nicht innerhalb eines Events. Ausserdem, wie
Bisonte richtig festgestellt hat, erzeugt diese Zeile ständig ein Event.

Die Zeile ist in jeder Hinsicht fehlplaziert!

Gruß
Thomas
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
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: ListViewGadget-Flimmern

Beitrag von matbal »

Daß der Eventloop ständig läuft, ist mir klar.

Mir ging es nur um das Flimmen aller Textzeilen, obwohl nur eine Zeile ständig überschrieben wird. Bei mir flimmern auch in Bisontes Code alle Zeilen, nur langsamer, da der Timer bestimmt, wie oft die Zeile geschrieben wird.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ListViewGadget-Flimmern

Beitrag von NicTheQuick »

Ich schätze mal das liegt an der Implementierung von dem ListViewGadget seitens Microsoft.
Unter Ubuntu zeigt der erste Code von 7x7 übrigens nur ein leeres Fenster. Der Code mit Timer funktioniert einwandfrei und flimmert nicht.
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: ListViewGadget-Flimmern

Beitrag von ts-soft »

matbal hat geschrieben:Macht man das gleiche mit dem ListIconGadget, so flimmert es bei mir nicht.
Da gibts auch nen "Bug" von MS. Fred nutzt dabei wohl doppelbuffering o. ä., damit die Gridlines
richtig sind.

Vielleicht kann man das auch anders implementieren, damit es nicht so flimmert, aber unabhängig davon,
sollte die Zeile anders plaziert werden :wink:
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
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: ListViewGadget-Flimmern

Beitrag von Vera »

Hi,
ich kann Nic's Erfahrung für Suse bestätigen.

Irgendwie hab' ich den Eindruck, das unter Linux das Abarbeiten von Befehlen anders gehandhabt wird, als im Code beschrieben. Erst werden die Prozesse im Hintergrund abgearbeitet (nach eigenen Vorgaben) und danach erst als Gesamt-Ergebnis (das Darstellen) präsentiert. Wenn also im Millisekundentackt (oder wie kurz?) was zur Darstellung dazukommt, dann werden die erstmal 'bis zum Ende' prozessiert, während aber schonmal, freundlicher weise, das blanke Fenster angezeigt wird. ;-)
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Georg
Beiträge: 29
Registriert: 17.06.2005 19:04

Re: ListViewGadget-Flimmern

Beitrag von Georg »

Hallo,

nur Windows:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 470, 340, "ListViewFlimmern", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ListViewGadget(0, 10, 10, 450, 320)
   For a = 1 To 10
      AddGadgetItem (0, -1, "irgendwas steht hier zur Demo")
   Next
   
   AddWindowTimer(0, 123, 500)
   Global counter = 0
   
   Repeat
     Event = WaitWindowEvent()
     
     If Event = #PB_Event_Timer
       If EventTimer() = 123
         SendMessage_(GadgetID(0),#WM_SETREDRAW,0, 0)
         SetGadgetItemText(0, 9, "Jetzt flimmerts nicht mehr so dolle!"+"   "+  Str(counter))
         SendMessage_(GadgetID(0),#WM_SETREDRAW,1, 0)
         counter + 1
       EndIf
     EndIf
     
   Until Event = #PB_Event_CloseWindow
 EndIf
__________________________________________________
Code-Tags hinzugefügt
16.01.2015
RSBasic
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: ListViewGadget-Flimmern

Beitrag von 7x7 »

Danke an alle für eure Antworten.

Habe das ListViewGadget() durch ListIconGadget() ersetzt. Läuft problemlos.

Ob das ListViewGadget()-Problem nun ein MS- oder PB-Problem ist, sei mal dahingestellt. Ein Bug im eigentlichen Sinn ist es nicht, aber es hinterlässt auf jeden Fall keinen guten Eindruck. Solche Unzulänglichkeiten lassen mich regelmässig frustriert in die Tischkante beissen.

Ich bin ja noch relativ froh, dass ich nicht unter Linux mit PB programmiere, nachdem @Nic -bestätigt von @Vera- noch ganz andere Probleme mit diesem Gadget haben.

In der Zwischenzeit ist schon wieder eine neue Fragwürdigkeit aufgetaucht. Ich werde noch wahnsinnig! Guckst du hier
ts-soft hat geschrieben:Niemals Code im EventLoop ausserhalb eines Events....
Grundsätzlich gebe ich dir natürlich Recht. Bei solchen Demo-Codes, die nur den Zweck haben etwas zu zeigen, sollte man einfach darüber hinwegsehen.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Antworten