Threads und Keyhit()

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Threads und Keyhit()

BeitragMo, Apr 06, 2009 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso funktioniert keyhit(KEY_B) in diesem Code nicht? Muss die Keyhit-Abfrage im gleichen Thread wie der Graphics-Aufruf sein? Wenn ja, warum?


Code: [AUSKLAPPEN]

Global data:TList = New TList
Global finish:Byte = False

Global keyMux:TMutex = CreateMutex()

Local thread1:TThread = CreateThread(thread1F,Null)
Local thread2:TThread = CreateThread(thread2F,Null)


WaitThread(thread1)
WaitThread(thread2)
End


Function thread1F:Object(data:Object)
   Print "thread 1 started"
   Repeat
      Print "running t1"
      Delay 100
      LockMutex keyMux
         If KeyHit(KEY_B)
            finish = True
            Print "finish = true"
         EndIf
      UnlockMutex keyMux

      
   Until finish
   Print "thread 1 finished"
End Function

Function thread2F:Object(data:Object)
   Print "thread 2 started"
   Graphics 400,300
   Repeat
      Print "running t2"
      Cls
      Flip
   Until finish
   Print "thread 2 finished"
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

amon

BeitragMo, Apr 06, 2009 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig geraten, ist eine Windows (?) Limitation, Events kriegt nur der UI Thread

Beispiel ist zwar jetzt sinnfrei, aber so zeigt es sich schön dass nur der eine Thread die KeyEvents kriegt.

Ich weiss ned wie das auf Linux / Mac ist, würde aber fast den kleinen Finger eines Admins verwetten, dass es dort auch so ist Wink

Code: [AUSKLAPPEN]

Global data:TList = New TList
Global finish:Byte = False
Global key:Int = 0

Global keyMux:TMutex = CreateMutex()

Local thread1:TThread = CreateThread(thread1F,Null)
Local thread2:TThread = CreateThread(thread2F,Null)


WaitThread(thread1)
WaitThread(thread2)
End


Function thread1F:Object(data:Object)
   Print "thread 1 started"
   Repeat
      Print "running t1"
      Delay 100
      LockMutex keyMux 
         If key = 1
            finish = True
            Print "finish = true"
         EndIf
      UnlockMutex keyMux
   Until finish
   Print "thread 1 finished"
End Function

Function thread2F:Object(data:Object)
   Print "thread 2 started"
   Graphics 400,300
   Repeat
      Print "running t2"
      Cls
      Flip
   If KeyHit(KEY_B)
      LockMutex keyMux 
      key = 1
           UnlockMutex keyMux
   EndIf
   Until finish
   Print "thread 2 finished"
End Function

Geeecko

BeitragMo, Apr 06, 2009 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Global data:TList = New TList
Global finish:Byte = False

Global keyMux:TMutex = CreateMutex()

Local thread1:TThread = CreateThread(thread1F,Null)
Local thread2:TThread = CreateThread(thread2F,Null)


WaitThread(thread1)
WaitThread(thread2)
End


Function thread1F:Object(data:Object)
   Graphics 800,800
   Repeat
      Cls
      DrawText "hi",0,0
      Flip
   Until KeyDown(KEY_ESCAPE)
End Function


Function thread2F:Object(data:Object)
   Repeat
      Print "hi"
      If(KeyHit(KEY_ESCAPE)) Then End
      Delay 1000
   Forever
End Function



Dieser Code funktioniert bei mir aber...
Ist doch fast das selbe, oder?
....

amon

BeitragMo, Apr 06, 2009 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
dann mach mal bei thread2F ein KEY_B rein, dann siehst Du den Effekt Smile

kog

BeitragMo, Apr 06, 2009 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert der KeyHit ablauf nicht so, sobald gedrückt wurde und abgefragt, wird es wieder auf 0 Gestellt? sprich es kann nicht 2 mal überprüft werden, mach es mal in einem Thread, wird auch nicht gehen:
Code: [AUSKLAPPEN]
 Graphics 800,600

Repeat
   If KeyHit(KEY_A)
      Print "HEHE"
   EndIf
   If KeyHit(KEY_A)
      Print "HEHE2"
   EndIf

Until KeyHit(KEY_ESCAPE) Or AppTerminate()


eines der beiden wird manchmal zufällig ausgelöst, je nach Position der schleife und des Events.

DaysShadow

BeitragMo, Apr 06, 2009 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau so ist es, Keyhit speichert nicht ob die Taste gedrückt wurde oder nicht, sondern wie oft und das kann man sich ausgeben lassen, wogegen Keydown prüft ob die Taste gedrückt wird oder nicht...
Ich mache mir deshalb für solche Dinge eine Variable für die Tasten die ich brauche, speichere zu Beginn der Hauptschleife in der jeweiligen Variable ob gedrückt wird oder nicht und setze sie am Ende der Schleife wieder auf null, da ich bei Keydown zuviele "Drücker" bekomme.

MfG DaysShadow
Blessed is the mind too small for doubt
 

Dreamora

BeitragMo, Apr 06, 2009 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Keyxxx / Mousexxx ist eine Max2D gebundene Abfrage in BM.
Das ist eigentlich weithin bekannt, da an verschiedenen Orten darauf hingewiesen wird, dass diese Funktionen nur funktionieren solange der Grafikkontext aktiv ist.

Dies sind keine Tastenevents.
Wenn du Tastenabfragen willst musst du mit den Events arbeiten.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

kog

BeitragMo, Apr 06, 2009 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, weil dann per WndProc oder allgemeinen KeyEventProc die Tasten im BMax programm gespeichert werden ... Ohne Fenster, auch keine Keys.

BtbN

BeitragDi, Apr 07, 2009 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Keyxxx / Mousexxx ist eine Max2D gebundene Abfrage in BM.


An Max2D nicht, sondern an PolledInput. Alles was die PolledInput füttern kann, kann auch zusammen mit KeyHit/MouseHit/... verwendet werden. In den meisten fällen ist dies zwar Max2D, aber nicht zwingend.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group