Frage zu AddWindowTimer()
Frage zu AddWindowTimer()
Hallo Leute,
ich war der Meinung, dass wenn einem Fenster ein Timer zugeordnet wird, die Anweisungen ausgeführt werden die dem Fall "#PB_Event_Timer"
zugeordnet sind solange das Fenster aktiv ist.
Ich habe nun aber festgestellt, dass wenn eine eine Prozedur aufgerufen wird aus der erst nach Ablauf der Timerzeit (bei weiterhin aktivem Fenster) zurückgekehrt wird die Anweisungen unter "#PB_Event_Timer" nicht ausgeführt werden.
Der TimerEvent unterbricht also nicht eine andere laufende Prozedur (ist also kein "Interrupt")
Sehe ich das richtig?
Gruß
Daffy
ich war der Meinung, dass wenn einem Fenster ein Timer zugeordnet wird, die Anweisungen ausgeführt werden die dem Fall "#PB_Event_Timer"
zugeordnet sind solange das Fenster aktiv ist.
Ich habe nun aber festgestellt, dass wenn eine eine Prozedur aufgerufen wird aus der erst nach Ablauf der Timerzeit (bei weiterhin aktivem Fenster) zurückgekehrt wird die Anweisungen unter "#PB_Event_Timer" nicht ausgeführt werden.
Der TimerEvent unterbricht also nicht eine andere laufende Prozedur (ist also kein "Interrupt")
Sehe ich das richtig?
Gruß
Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
Re: Frage zu AddWindowTimer()
Richtig,
WindowTimer von PB ist nur ein "Zusatzevent" welches halt in regelmäßigen Abständen gesendet wird.
Wird die aber nicht abgefragt, passiert auch nichts.
WindowTimer von PB ist nur ein "Zusatzevent" welches halt in regelmäßigen Abständen gesendet wird.
Wird die aber nicht abgefragt, passiert auch nichts.
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
Re: Frage zu AddWindowTimer()
@Stargate
Danke für die Info!
Gibt es denn eine Möglichkeit irgendetwas im Hintergrund laufen zu lassen (z. B. einen Timer) der eine Unterbrechung erzwingt?
Auf den ersten Blick könnte man meinen, dass man das mit einem "Thread" machen könnte aber so wie ich das gelesen habe kann man dem nur etwas übergeben.
Es scheint keine Möglichkeit zu geben das der "Thread" im "normalen Programm" irgend ein "Flag" setzt.
Gruß
Daffy
Danke für die Info!
Gibt es denn eine Möglichkeit irgendetwas im Hintergrund laufen zu lassen (z. B. einen Timer) der eine Unterbrechung erzwingt?
Auf den ersten Blick könnte man meinen, dass man das mit einem "Thread" machen könnte aber so wie ich das gelesen habe kann man dem nur etwas übergeben.
Es scheint keine Möglichkeit zu geben das der "Thread" im "normalen Programm" irgend ein "Flag" setzt.
Gruß
Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
- TheCube
- Beiträge: 169
- Registriert: 20.07.2010 23:59
- Computerausstattung: Risen 3400G 16MB Win10-64Bit
- Wohnort: NRW
Re: Frage zu AddWindowTimer()
Also ich bemühe gerne aus der Windows-API "SetTimer_", wenn ich einen immer laufenden Timer haben möchte.
Hier ein kleiner Code zum Spielen, bei dem die Procedure alle 500ms ausgeführt wird, egal ob Fenster aktiv/inaktiv ist oder grade verschoben wird:
Und das der Thread nichts direkt zurückgeben kann habe ich mit einer globalen Variablen umgangen.
Das kann man sicher eleganter lösen (k.A. Struktur übergeben, oder, oder ,...)
Edit: Code nach Hinweis von ts-soft verbessert.
Hier ein kleiner Code zum Spielen, bei dem die Procedure alle 500ms ausgeführt wird, egal ob Fenster aktiv/inaktiv ist oder grade verschoben wird:
Code: Alles auswählen
Enumeration
#Window_0
#Image1
#ImageGadget1
EndEnumeration
CreateImage(#Image1,50,20)
Global Flag
Procedure ToggleFlag(hWnd, uMsg, idEvent, time.l)
StartDrawing(ImageOutput(#Image1))
DrawText(3,2,Str(Flag),$AAAAAA)
StopDrawing()
SetGadgetState(#ImageGadget1,ImageID(#Image1))
flag+1
EndProcedure
If OpenWindow(#Window_0, 100, 100, 200, 60, "Testfenster", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar)
ImageGadget(#ImageGadget1,20,20,0,0,ImageID(#Image1),#PB_Image_Border)
Else: End : EndIf
SetTimer_(WindowID(#Window_0), 1, 500, @ToggleFlag())
Repeat : Until WaitWindowEvent() = #WM_CLOSEDas kann man sicher eleganter lösen (k.A. Struktur übergeben, oder, oder ,...)
Edit: Code nach Hinweis von ts-soft verbessert.
Zuletzt geändert von TheCube am 27.02.2012 00:36, insgesamt 1-mal geändert.
- 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: Frage zu AddWindowTimer()
Dein Timercallback ist nicht korrekt und kann dann irgendwann mal Probleme machen!
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Die Parameter müssen vorhanden sein, egal ob genutzt oder nicht!
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Die Parameter müssen vorhanden sein, egal ob genutzt oder nicht!
Code: Alles auswählen
Procedure ToggleFlag(hWnd, uMsg, idEvent, time.l)
StartDrawing(ImageOutput(#Image1))
DrawText(3,2,Str(Flag),$AAAAAA)
StopDrawing()
SetGadgetState(#ImageGadget1,ImageID(#Image1))
flag+1
EndProcedurePureBasic 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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- TheCube
- Beiträge: 169
- Registriert: 20.07.2010 23:59
- Computerausstattung: Risen 3400G 16MB Win10-64Bit
- Wohnort: NRW
Re: Frage zu AddWindowTimer()
Danke für den Hinweis.
Re: Frage zu AddWindowTimer()
@theCube & ts-soft
SUUUPER, genau so etwas habe ich gesucht!!!
Vielen Dank
Daffy
PS. Das Ganze dient dazu die Abfragerate von Messwerten die über eine serielle Schnittstelle angefordert werden zu reduzieren.
Die Anforderung der Messwerte findet in verschiedenen Prozeduren statt die sich nicht innerhalb des Hauptprogramms befinden.
Ich dachte ursprünglich das wäre mit dem Timerevent des Windows lösbar aber da dieser keine Unterbrechung auslöste ging das so leider nicht.
SUUUPER, genau so etwas habe ich gesucht!!!
Vielen Dank
Daffy
PS. Das Ganze dient dazu die Abfragerate von Messwerten die über eine serielle Schnittstelle angefordert werden zu reduzieren.
Die Anforderung der Messwerte findet in verschiedenen Prozeduren statt die sich nicht innerhalb des Hauptprogramms befinden.
Ich dachte ursprünglich das wäre mit dem Timerevent des Windows lösbar aber da dieser keine Unterbrechung auslöste ging das so leider nicht.
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
Re: Frage zu AddWindowTimer()
Hallo, jetzt bitte nicht denken "Wenn man ihm den kleinen Finger gibt, dann nimmt er gleich den ganzen Arm...".
Diese Timer-Lösung ist ja offenbar immer nur für das jeweils aktive Fenster gültig und es ist auch kein Problem bei jedem neuen Fenster den Timer neu zu starten aber gibt es auch eine "programmweite" Lösung unabhängig vom jeweils geöffneten Fenster?
Gruß
Daffy
Diese Timer-Lösung ist ja offenbar immer nur für das jeweils aktive Fenster gültig und es ist auch kein Problem bei jedem neuen Fenster den Timer neu zu starten aber gibt es auch eine "programmweite" Lösung unabhängig vom jeweils geöffneten Fenster?
Gruß
Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
- 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: Frage zu AddWindowTimer()
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- TheCube
- Beiträge: 169
- Registriert: 20.07.2010 23:59
- Computerausstattung: Risen 3400G 16MB Win10-64Bit
- Wohnort: NRW
Re: Frage zu AddWindowTimer()
Mal wieder ein interessanter & lehrreicher Code ...viewtopic.php?p=110805#p110805
Ich hätte (als "fortgeschrittener Anfänger"
Stört nicht und man kann bei der simpleren Methode bleiben. Ein globales Flag (oder sonstwas) wäre ja programmweit genug.
Aber jeder wie er´s mag ....