mausposition in anderem thread bei klick bestimmen

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

mausposition in anderem thread bei klick bestimmen

Beitrag 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
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: mausposition in anderem thread bei klick bestimmen

Beitrag 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
Zuletzt geändert von jojo1541 am 21.10.2011 19:32, insgesamt 1-mal geändert.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: mausposition in anderem thread bei klick bestimmen

Beitrag 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
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: mausposition in anderem thread bei klick bestimmen

Beitrag 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?
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: mausposition in anderem thread bei klick bestimmen

Beitrag von teamO »

jetzt funzts! Danke :)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: mausposition in anderem thread bei klick bestimmen

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten