Wieder mal ein Timer-Problem
-
- Beiträge: 59
- Registriert: 28.12.2006 17:44
- Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner... - Wohnort: Nordkirchen
Wieder mal ein Timer-Problem
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
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
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
die quick-and-dirty lösung wäre ein
Code: Alles auswählen
While WindowEvent() : Wend
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.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 59
- Registriert: 28.12.2006 17:44
- Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner... - Wohnort: Nordkirchen
???
Sorry, aber nix verstanden....
Hier zur besseren Verständnis von dem, was ich meine, ein sehr stark abgespeckter Code:
Hab' da schon einiges ausprobiert, aber nix klappte...
Gruß 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)
Gruß Micro
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
...und dort muss dann der eventschlucker hin, falls du dich für die quick'n'dirty entscheidest.Micro hat geschrieben:Code: Alles auswählen
; Und hier soll dann die Pause gemacht werden, Zeit variabel....
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.
Der Weise weiß, dass er ein Narr ist.
also so:
Edit: Dabei ist WaitWindowEvent(1) wichtig, sonst geht die Auslesung nicht weiter wenn nix passiert.
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)
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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
-
- Beiträge: 59
- Registriert: 28.12.2006 17:44
- Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner... - Wohnort: Nordkirchen
Hi Leute,
ich danke euch für eure Hilfe. Jetzt funktioniert es!
Hab' es so gelöst:
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
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)
Gruß Micro