Threads und Keyhit()
Übersicht

![]() |
FirstdeathmakerBetreff: Threads und Keyhit() |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann mach mal bei thread2F ein KEY_B rein, dann siehst Du den Effekt ![]() |
||
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, weil dann per WndProc oder allgemeinen KeyEventProc die Tasten im BMax programm gespeichert werden ... Ohne Fenster, auch keine Keys. | ||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group