Seite 1 von 1

mausposition in anderem thread bei klick bestimmen

Verfasst: 20.10.2011 23:39
von teamO
Hi Leute,

was ich im titel umständlich auf wenige wörter gequetsch sagen wollte war: Ich habe 2 Threads. im 1. wird ein Fenster mit Windowed screen durchlaufen. der 2. wird erst bei bedarf gestartet. An einem gewissen punkt ist es nötig, dass der 2. Thread bei einem Klick die Mausposition in bezug auf das Fenster erhält. während der ganzen zeit muss der 1. thread weiterlaufen

mein ansatz war: (im 2. Thread)

Code: Alles auswählen

...
    Repeat
      Delay(1)
      ExamineMouse()
    Until MouseButton(#PB_MouseButton_Left)
    Debug WindowMouseX(0)
    Debug WindowMouseY(0)
...
das problem war, dass dann die Maus auf dem Windowed screen gefangen blieb, auch als der thread beendet wurde. also hab ich noch ein
releaseMouse(#true)
hinzugefügt

nun soll der thread aber mehrmals hintereinander aufgerufen werden können. beim 1. mal funktioniert alles bestens, beim 2. mal erkennt der pc sofort einen (nicht vorhandenen) mausklick und springt aus der schleife, ohne das ich geklickt hätte. machmal springt der coursor auch noch an die position, wo ich das letzte mal geklickt hab.

ich kenn mich mit dieser ganzen maus geschichte nicht so aus... habt ihr ne ahnung an was das liegt?
oder gibts vielleicht viel elegantere lösung, die ich nur nicht sehe?

grüße,
TeamO

Re: mausposition in anderem thread bei klick bestimmen

Verfasst: 20.10.2011 23:54
von jojo1541
In etwa so?

Code: Alles auswählen

InitSprite()

EnableExplicit

Global Event, Quit, Pushed, Thread

#Space = 0

OpenWindow(0,#PB_Ignore,#PB_Ignore,100,100,"Test",#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,100,50,0,0,0)

AddKeyboardShortcut(0,#PB_Shortcut_Space,#Space)

Procedure GetMousePos(Wert)
  Repeat
    
  
    If Pushed = 1
      Debug WindowMouseX(0)
      Debug WindowMouseY(0)
      pushed = 0
    EndIf
    
    Delay(10)
    
  ForEver
    
EndProcedure   


 Thread = CreateThread(@GetMousePos(),0)


Repeat
 
  Event = WaitWindowEvent()
 
  If event = #PB_Event_Menu
    
    Select EventMenu()
        
      Case #Space
        
        Pushed = 1
        
    EndSelect
    
  EndIf  
        
  If Event = #PB_Event_CloseWindow
    Quit = 1
  EndIf
 
  If Quit = 1
    KillThread(Thread)
    End
  EndIf
 
ForEver
Leertaste drücken, damit der Thread ausgeführt wird. (Is momentan noch API, weil ich grad zu faul war, die DirectX-Tastatur zu benutzen. Kannste aber ändern)

Edit: Code aktualisiert

Re: mausposition in anderem thread bei klick bestimmen

Verfasst: 21.10.2011 01:05
von teamO
danke!
war aber leider nicht ganz das, was ich brauche.. hab mich wohl missverständlich ausgedrückt... sorry :(

der 2. Thread wird schon bevor die mausposition ermittelt werden soll gestartet. (das ist fix, kann ich nicht ändern) und die Position wird dann in diesem Thread gebraucht. dh. ich könnte sie zwar im fensterthread ermitteln, und dann irgendwie synchronisiert übergeben oder so, aber ich glaub das würde seeehr unschön werden. genauso, wenn ich den zetpunkt im windowed. thread ermittel und dann dem 2. thread bescheid geb. müsste irgendwie über semaphore gelöst werden, oder?

dein code läuft bei mir (win 7 pb4.5 64bit) seltsamer weise auch nicht richtig. er gibt mir sofort, ohne zu warten die mausposition... scheinbar denkt er sofort, er hätte eine gedrückte leertaste... ka warum

Re: mausposition in anderem thread bei klick bestimmen

Verfasst: 21.10.2011 19:31
von jojo1541
MIt der 64-Bit Version kann ich es auch nachvollziehen (Ist anscheinend die API, die spinnt). Hab es mal im obigen Beitrag entsprechend geändert, damit es auch unter 64-Bit läuft. Auch läuft der zweite Thread jetzt von anfang an mit.

Bei der Gelegenheit mal ne Frage an die thread-Spezialisten hier im Forum: ab wann sollte man einen Mutex benutzen?

Re: mausposition in anderem thread bei klick bestimmen

Verfasst: 23.10.2011 16:14
von teamO
jetzt funzts! Danke :)

Re: mausposition in anderem thread bei klick bestimmen

Verfasst: 23.10.2011 18:29
von PMV
jojo1541 hat geschrieben:Bei der Gelegenheit mal ne Frage an die thread-Spezialisten hier im Forum: ab wann sollte man einen Mutex benutzen?
Bei allem, was keinen atomarer Aufruf darstellt und von mehr als
einem Thread verwendet wird. Sprich überall, wo drauf zugegriffen
wird und komplexer ist als ein Long/ Float bei x86 bzw.
Quad/Double bei x64. Und die müssen geschützt werden, sonst
gibt es IMAs bzw. unkonrollierbare Abstürze.

Wenn 2 Threads gleichzeitig lesend und schreibend auf solche atomaren
Variablen zugreifen, ist ebenfalls ein Mutex nötig, weil das dann auch 2
Operationen sind und zwischenzeitig der andere Thread ja auch drauf
zugreifen kan. Ich spreche von so was wie "var + 1" ... schreibt ein
anderer Thread auch darauf, muss dies geschützt werden, damit das
Ergebnis immer korrekt ist. Sprich das wird sonst zu einem Logikproblem,
wo der Inhalt von "var" verfälscht wird. Das nicht zu tun würde auch
nicht direkt zu Abstürzen führen.

Und natürlich alle Funktionsaufrufe, die nicht Threadsafe sind. Weitere infos
gibs in den FAQ: http://forums.purebasic.com/german/view ... =9&t=18374

MFG PMV