Frage zu AddWindowTimer()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Frage zu AddWindowTimer()

Beitrag von Daffy0815 »

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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frage zu AddWindowTimer()

Beitrag von STARGÅTE »

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.
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
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Frage zu AddWindowTimer()

Beitrag von Daffy0815 »

@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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Frage zu AddWindowTimer()

Beitrag von TheCube »

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:

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_CLOSE
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.
Zuletzt geändert von TheCube am 27.02.2012 00:36, insgesamt 1-mal geändert.
Benutzeravatar
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()

Beitrag von ts-soft »

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!

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
EndProcedure
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.
Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Frage zu AddWindowTimer()

Beitrag von TheCube »

Danke für den Hinweis.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Frage zu AddWindowTimer()

Beitrag von Daffy0815 »

@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.
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Frage zu AddWindowTimer()

Beitrag von Daffy0815 »

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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
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()

Beitrag von ts-soft »

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.
Bild
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Frage zu AddWindowTimer()

Beitrag von TheCube »

viewtopic.php?p=110805#p110805
Mal wieder ein interessanter & lehrreicher Code ...
Ich hätte (als "fortgeschrittener Anfänger" :) ) aber trotzdem einfach ein Dummyfenster für den Timer benutzt und das meinetwegen unsichtbar verkleinert.
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 ....
Antworten