eventhandling bei mehreren Fenstern

Anfängerfragen zum Programmieren mit PureBasic.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

eventhandling bei mehreren Fenstern

Beitrag von teamO »

hey leute!

ich versuch grade ein Programm zu schreiben um meine Mauspräzesion zu erhöhen: ein kleine schwarzer Kreis soll auf dem Bildschirm angezeigt werden, und falls ich darauf klicke soll er seine Posistion ändern. Ich habe das über ein sticky window ohne rahmen gelöst.
Dann sollen in einem Hauptfenster gewisse Parameter einstellbar sein, wie zb. größe des balles, außerdem soll die Zeit, und die erfolgreichen klicks ausgegeben werden.

ich hab das momentan über eine große Schleife gelöst, die dann den einzelnen Fenstern ihre Signale weitergibt. Das Problem ist nur, dass sich dabei mein Punktfenster irgendwie vernachlässigt fühlt und Windows meint es würde nicht mehr reagieren...
á la:

Code: Alles auswählen

open window1
open window2

repeat
waitwindowevent(10)
falls event im window 1: 
  mach eventhandling window 1
falls im window 2:
  mach eventhandling window 2
until hauptfenster geschlossen
---

Ich hatte schon öfters Probleme mit dem Eventhandling bei mehreren Fenstern. Wisst ihr obs irgendwo dazu ne gute einführung gibt? im Handbuch hab ich schon geschaut, aber das ist nicht sehr detailiert und auch nur für einzelne Fenster...

wär cool, wenn jemand wüsste wie so was geht ;)

grüße,
TeamO
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: eventhandling bei mehreren Fenstern

Beitrag von STARGÅTE »

Die Events aller Fenster werden in einer einzigen Schleife verarbeitet:, in der dann abgefragt wird, welches Fenster das Ereigniss hatte, zB so:

Code: Alles auswählen

Select WaitWindowEvent()
	Case #PB_Event_CloseWindow
		Select EventWindow()
			Case #MainWindow
			Case #ChildWindow
		EndSelect
EndSelect
Zu beachten ist dabei, dass du keine anderen Sachen in dieser Schleife haben darfst.
Damit meine ich z.B. Screen-Funktionen, Drawing-Funktionen usw.
Solche Sachen, dürfen nur dann ausgeführt werden, wenn es aktuell kein Event gibt.
machst du solche Sachen dennoch in der selben Schleife, bremsen diese Mal-Funktionen die Event-Abarbeitung aus.

Ich vermute in deinem fall, dass du zu oft den schwarzen Kreis zeichnest, und das eben an der "verbotenen Stelle".
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
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: eventhandling bei mehreren Fenstern

Beitrag von teamO »

Danke Stargate :D

hab in der Tat in der Schleife den Ball gezeichnet. Hab es jetzt ausgelagert. Es funktioniert aber irgendwie immernoch nicht. Das Ball-fenster friert weiterhin ein, bzw. windows denkt es wäre tot.
Ich habe das Fenster innerhalb eines anderen Threads geöffnet, könnt da das Problem herkommen?

meine Schleife sieht jetzt so aus:

Code: Alles auswählen


Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      CloseWindow(EventWindow())
      
    Case #PB_Event_Repaint
      Select EventWindow()
        Case #dotWindow
          SignalSemaphore(dotRepaint)
        Case #controlWindow
          SignalSemaphore(controlRepaint)
      EndSelect
      
          
    Default
      Select EventWindow()
        Case #dotWindow
              
          If EventType()=#PB_EventType_LeftClick
            SignalSemaphore(hitSema)
         EndIf
         
       Case #controlWindow
     EndSelect
 EndSelect
ForEver
ist wahrscheinlich nicht der effizienteste weg es zu lösen, aber eigentlich müsste es doch funktionieren, oder?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: eventhandling bei mehreren Fenstern

Beitrag von STARGÅTE »

teamO hat geschrieben:Ich habe das Fenster innerhalb eines anderen Threads geöffnet, könnt da das Problem herkommen?
Ja, Zitat:
PureBasic Hilfe hat geschrieben:Hinweis: Wenn ein Fenster von einem Thread geöffnet wird, dann muss der Thread auch WindowEvent() oder WaitWindowEvent() in einer Schleife aufrufen, um die Ereignisse für dieses Fenster zu verarbeiten, da Window-Ereignisse nicht zwischen verschiedenen Threads gesendet werden.
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
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: eventhandling bei mehreren Fenstern

Beitrag von teamO »

Stimmt :oops:

Danke Stargate! jetzt funktionierts !!! :D
Antworten