Seite 1 von 1
Wieder mal ein Timer-Problem
Verfasst: 14.04.2008 19:56
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
Verfasst: 14.04.2008 20:15
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)
Verfasst: 14.04.2008 20:15
von Kaeru Gaman
re-aufbau des fenster ist normalerweise ein event-abarbeitungs-problem.
die quick-and-dirty lösung wäre ein
um die Event-Queue zu leeren.
allerdings verlierst du damit auch Events, auf die du vielleicht reagieren willst.
Verfasst: 14.04.2008 21:33
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
Verfasst: 14.04.2008 21:38
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.
Verfasst: 14.04.2008 21:45
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.
Verfasst: 14.04.2008 21:47
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
Verfasst: 15.04.2008 22:17
von Micro
Hi Leute,
ich danke euch für eure Hilfe. Jetzt funktioniert es!
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