Geflimmer!

Anfängerfragen zum Programmieren mit PureBasic.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Geflimmer!

Beitrag von PB42 »

Hallo,

die Ergebnisanzeige des folgenden (stark gekürzten) Codes flimmert, solange die Maus über dem Fenster ist, und nur dann! Wie kommt das? Danke.

PB42

Code: Alles auswählen

OpenWindow(0,0,0,606,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"") And CreateGadgetList(WindowID(0)) 

TextGadget(13,50,118,506,30,"",#PB_text_border|#PB_TEXT_center)

If LoadFont(0,"arial",12)
EndIf
SetGadgetFont(#PB_Default,FontID())
ButtonGadget(14,446,41,110,22,"Berechnen")

Repeat
  Delay(5)
  eventID = WindowEvent()
  GadgetID = EventGadgetID()
  Select GadgetID

  Case 14
  If f.f = 0
  f.f = 0.2
  EndIf
  g.f = (a + b + c) * d.f
  h.f = g.f * f.f
  If LoadFont(1,"arial",12)
  EndIf
  SetGadgetFont(#PB_Default,FontID())
  TextGadget(13,50,118,506,30,"Ergebnis",#PB_text_border|#PB_TEXT_center)

  EndSelect

Until WaitWindowEvent()=#PB_Event_CloseWindow 
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Das Geflimmer hat aufgehört! Ich habe in dem Code unter "Repeat" das "WindowEvent" durch "WaitWindowEvent" ersetzt und den Delay entfernt. Das war's.

PB42
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Probiers nochmal mit dem code vorher, allerdings mit dem Unterschied, dass du das Delay() nicht am Anfang der Repeatschleife setzt, sondern dahinter. Dann sollte es auch gehen. Die Verzögerung muss mind. 1 ms betragen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

OMG:

Code: Alles auswählen

  eventID = WindowEvent()
...
Until WaitWindowEvent()=#PB_Event_CloseWindow
Wasn das für ne Logik? ;)

Code: Alles auswählen

  eventID = WindowEvent()
...
Until eventID=#PB_Event_CloseWindow
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

@AND51 Bringt keinen Unterschied, aber macht ja nichts, das Problem ist ja nun gelöst.

PB42
Zuletzt geändert von PB42 am 04.11.2005 13:51, insgesamt 1-mal geändert.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Hallo DarkDragon,

oh Danke, das war ein Schreibfehler von mir, aber das hat keinen Einfluß auf den Flimmer-Effekt.

PB42
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

DarkDragon hat geschrieben:OMG:

Code: Alles auswählen

  eventID = WindowEvent()
...
Until WaitWindowEvent()=#PB_Event_CloseWindow
Wasn das für ne Logik? ;)[/code]
Oh, das hatte ich übersehen, hatte den Code nur überflogen...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Beitrag von Pelagio »

@PB42

Ein Problem, welches das Flimmern in erster Linie (meiner Meinung nach) hervorruft ist, das du innerhalb deiner Repeatschleife, bei jedem Durchlauf den Font() und auch das TextGadget-Steuerelement neu setzt, erstellst.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Das Problem ist auch, dass die gesamte Ereignisbehandlung unvollständig ist. Wo wird hier die eventID überprüft, wo der Typ? So schlägt jedes Ereignis, egal welches, immer gleich voll durch, egal ob es mit dem Gadget zu tun hat oder nicht.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Pelagio hat geschrieben:Ein Problem, welches das Flimmern in erster Linie (meiner
Meinung nach) hervorruft ist, das du innerhalb deiner Repeatschleife, bei
jedem Durchlauf den Font() und auch das TextGadget-Steuerelement neu
setzt, erstellst.
jau, folgende Zeilen sollten vor der Repeat-Schleife stehen

Code: Alles auswählen

If LoadFont(1,"arial",12)
EndIf
SetGadgetFont(#PB_Default,FontID())
TextGadget(13,50,118,506,30,"Ergebnis",#PB_text_border|#PB_TEXT_center) 
Grüße ... Kiffi
Antworten