Wieder mal ein Timer-Problem

Anfängerfragen zum Programmieren mit PureBasic.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Wieder mal ein Timer-Problem

Beitrag von Micro »

Hallo Leute,

hab' da mal wieder ein Problem, womit ich nicht zurecht komme.
Folgendes Problem:

Ich möchte über ein Button eine While-Schleife aufrufen. Diese While-Schleife durchläuft eine Database. Nun möchte ich aber gerne, das nach jedem Durchlauf eine kleine Pause eingelegt werden kann.

Delay() kommt nicht in frage, da weil wenn das Programm den Focus verliert und dann wieder bekommt, das Fenster dann "Weiss" ist. Erst nach Schleifenende ist dann wieder alles Normal.

Also die WinAPI angeschaut und SetTimer_ gefunden. Nur damit komme ich noch nicht so klar.

Wie schaffe ich es, diese Pause innerhalb der Case-Abfrage einzubauen, ohne daß das System mir ein weisses Fenster präsentiert?

Gruß Micro
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

lass das Programm nur mit einem Delay(1) laufen und lasse neben bei ein Counter auf 0 Zählen, erreicht er 0, gehts ab in die Abfrage und der Counter ist wieder bei 1000 (wenn es 1s warten soll)
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

re-aufbau des fenster ist normalerweise ein event-abarbeitungs-problem.
die quick-and-dirty lösung wäre ein

Code: Alles auswählen

While WindowEvent() : Wend
um die Event-Queue zu leeren.
allerdings verlierst du damit auch Events, auf die du vielleicht reagieren willst.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Beitrag von Micro »

???

Sorry, aber nix verstanden....

Hier zur besseren Verständnis von dem, was ich meine, ein sehr stark abgespeckter Code:

Code: Alles auswählen

If OpenWindow(0, 216, 0, 264, 260, "Testfenster", #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(01, 90, 150, 80, 30, "Machwas")
    ButtonGadget(02, 90, 200, 80, 30, "Ohne Funktion")
  EndIf
EndIf

Repeat 
  EventID.l = WaitWindowEvent() 
  
  Select EventID 
  
    Case #PB_Event_Gadget   ; Hier das Buttonmenü
		  Select EventGadget()
		  Case 01
		    ; Hier der Funktionsaufruf dür die Database....
		    While NextDatabaseRow(100)
            ; Hier der Funktionsaufruf der Datenbank
            ; Und hier soll dann die Pause gemacht werden, Zeit variabel....
		    Wend
		    ; Weitere Funktionsaufrufe für Case01
		    
		  Case 02
		    ; Etwas anderes...

      EndSelect

    Case #PB_Event_CloseWindow
      End

  EndSelect

Until Quit = 1

; IDE Options = PureBasic 4.10 (Windows - x86)
 
Hab' da schon einiges ausprobiert, aber nix klappte...

Gruß Micro
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Micro hat geschrieben:

Code: Alles auswählen

            ; Und hier soll dann die Pause gemacht werden, Zeit variabel.... 
...und dort muss dann der eventschlucker hin, falls du dich für die quick'n'dirty entscheidest.
andernfalls nimm die interne While-Schleife raus,
und arbeite jede Databaserow in einem Hauptschleifendurchlauf durch.
sowas kann man mit nem Flag lösen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

also so:

Code: Alles auswählen

If OpenWindow(0, 216, 0, 264, 260, "Testfenster", #PB_Window_SystemMenu) 
  If CreateGadgetList(WindowID(0)) 
    ButtonGadget(01, 90, 150, 80, 30, "Machwas") 
    ButtonGadget(02, 90, 200, 80, 30, "Ohne Funktion") 
  EndIf 
EndIf 

Repeat 
  EventID.l = WaitWindowEvent(1) 
  
  Select EventID 
  
    Case #PB_Event_Gadget   ; Hier das Buttonmenü 
        Select EventGadget() 
        Case 01 
          ; Hier der Funktionsaufruf dür die Database.... 
          Auslesen = #True : Counter = 0
          ; Weitere Funktionsaufrufe für Case01 
          
        Case 02 
          ; Etwas anderes... 

      EndSelect 

    Case #PB_Event_CloseWindow 
      End 

  EndSelect 

  If Auslesen
    If Counter = 0
      If NextDatabaseRow(100) 
        ; Hier der Funktionsaufruf der Datenbank
        Counter = 1000 ; Jenachdem wie lange die Pausen sein sollen
      Else
        Auslesen = #False
      EndIf
    EndIf
    Counter - 1
  EndIf

Until Quit = 1 

; IDE Options = PureBasic 4.10 (Windows - x86) 
Edit: Dabei ist WaitWindowEvent(1) wichtig, sonst geht die Auslesung nicht weiter wenn nix passiert.
Zuletzt geändert von STARGÅTE am 14.04.2008 21:47, insgesamt 1-mal geändert.
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
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Versuch es mal so :

Code: Alles auswählen

If OpenWindow(0, 216, 0, 264, 260, "Testfenster", #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(01, 90, 150, 80, 30, "Machwas")
    ButtonGadget(02, 90, 200, 80, 30, "Ohne Funktion")
  EndIf
EndIf

TimeOut = #PB_Default

Repeat
  EventID.l = WaitWindowEvent(TimeOut)
 
  If TimeOut <> #PB_Default
  	If NextDatabaseRow(100)
		; Hier der Funktionsaufruf der Datenbank
   	; Und hier soll dann die Pause gemacht werden, Zeit variabel....
  	Else
  		timeout = #PB_Default
  		DisableGadget(1,#False)
  	EndIf 	
  EndIf 
 
  Select EventID
 
    Case #PB_Event_Gadget   ; Hier das Buttonmenü
        Select EventGadget()
        Case 01
          TimeOut = 0
          DisableGadget(1,#True)
        Case 02
          ; Etwas anderes...
      EndSelect

    Case #PB_Event_CloseWindow
      End

  EndSelect

Until Quit = 1 
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Beitrag von Micro »

Hi Leute,

ich danke euch für eure Hilfe. Jetzt funktioniert es! :allright:

Hab' es so gelöst:

Code: Alles auswählen

If OpenWindow(0, 216, 0, 264, 260, "Testfenster", #PB_Window_SystemMenu) 
  If CreateGadgetList(WindowID(0)) 
    ButtonGadget(01, 90, 150, 80, 30, "Machwas") 
    ButtonGadget(02, 90, 200, 80, 30, "Ohne Funktion") 
  EndIf 
EndIf 

Repeat 
  EventID.l = WaitWindowEvent() 
  
  Select EventID 
  
    Case #PB_Event_Gadget   ; Hier das Buttonmenü 
        Select EventGadget() 
        Case 01 
          ; Hier der Funktionsaufruf dür die Database.... 
          While NextDatabaseRow(100) 
            ; Hier der Funktionsaufruf der Datenbank 
            ; Und hier soll dann die Pause gemacht werden, Zeit variabel.... 

waitSec = 5
Waiting = ElapsedMilliseconds() + waitSec * 1000 
While Waiting > ElapsedMilliseconds():Delay(1):WindowEvent():Wend 

          Wend 
          ; Weitere Funktionsaufrufe für Case01 
          
        Case 02 
          ; Etwas anderes... 

      EndSelect 

    Case #PB_Event_CloseWindow 
      End 

  EndSelect 

Until Quit = 1 

; IDE Options = PureBasic 4.10 (Windows - x86) 
Mit dem WindowEvent() innerhalb der Schleife kommt das nun auch mit dem Refresh des Fensters hin. CPU-Auslastung ist auch sehr gering, eigendlich ist das sehr zu empfehlen.

Gruß Micro
Antworten