Des touches fantomes !

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

Message par KrisJNT »

Ah ! enfin quelqu'un qui les même erreurs que moi ! Merci KCC ^^ !
Le port série n'est invoqué que lorsque l'on appuie sur [Enter] donc je ne pense pas qu'il y ait lieu de les retirer...
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Le problème persiste si tu retires toutes les références à GetAsyncKeyState_() ?
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

Message par KrisJNT »

Oui, le problème persiste. Je suis en train de me demander : si l'on appuie sur deux touches à la fois pendant que l'on s'amuse avec les flèches, peut-être que PB comprends que c'est un autre caractère... Mais dans ce cas, pourquoi seulement ceux qui sont enregistrés dans le tableau ??? :?

Voici le code modifié avec ExamineKeyboard() :

Code : Tout sélectionner

InitSprite() : InitKeyboard() 
LoadFont(0, "Arial", 20, #PB_Font_HighQuality) 

Global x = 0 
Global y = 0 
Global blackit 

Global Dim char(20, 2) 

Procedure drawBG() 
  Box(0, 0, 600, 200, $A7C6A1) 
  For b = 0 To 19 
    Box(30 * b + 2, 2, 28, 38, $9BBE93) 
    Box(30 * b + 2, 44, 28, 38, $9BBE93) 
  Next 
EndProcedure 

Procedure drawTchar() 
  DrawingFont(FontID(0)) 
  For u = 0 To 19 
    For v = 0 To 1 
      DrawText(30 * u + 2 + Int((28 - TextWidth(Chr(char(u, v))))/2), 42 * v + 40 - TextHeight(Chr(char(u, v))), Chr(char(u, v)), 0, $9BBE93) 
    Next 
  Next 
EndProcedure 

Procedure blackIT(delay) 
  Repeat 
    blackit = ~blackit 
    Delay(delay) 
  ForEver 
EndProcedure 

Procedure caClignoooooote(delay) 
  CreateThread(@blackIT(), delay) 
  Repeat 
    FlipBuffers() 
    StartDrawing(ScreenOutput()) 
      drawBG() 
      drawTchar() 
      If blackit : Box(30 * x + 2, 42 * y + 2, 28, 38, 0) : EndIf 
    StopDrawing() 
  ForEver 
EndProcedure 

Procedure sendData() 
  dat$ = "" 
  For l = 0 To 1 
    For c = 0 To 19 
      dat$ = dat$ + Chr(char(c, l)) 
    Next 
    dat$ = dat$ + Chr(10) 
  Next 
  
  WriteSerialPortString(0, dat$, #PB_Ascii) 
EndProcedure 

lcdStart.s = " LCD Writer v:1.0.1 " + Chr(10) + "********************" 
OpenSerialPort(0, "COM1", 110, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 0, 40) 
WriteSerialPortString(0, lcdStart, #PB_Ascii) 

CreateImage(0, 600, 84) 

OpenWindow(0, 10, 10, 600, 84, "LCD Writer", #PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_SystemMenu) 
OpenWindowedScreen(WindowID(0), 0, 0, 600, 84, 1, 0, 0) 

CreateThread(@caClignoooooote(), 500) 

Repeat 
  event = WaitWindowEvent(10) 
  
  ExamineKeyboard() 
  key$ = KeyboardInkey() 
  
  If KeyboardReleased(#PB_Key_Return)
    SetWindowTitle(0, "TRANSFERT...") 
    sendData() 
    SetWindowTitle(0, "LCD Writer") 
  EndIf 

  If key$
    char(x, y) = Asc(key$) 
    If x = 19 
      y = (y + 1) % 2 
    EndIf 
    x = (x + 1) % 20 
 EndIf 
  
  If KeyboardReleased(#PB_Key_Back)
    If Not temoinB Or ElapsedMilliseconds() - ctrB >= 250 
      char(x, y) = 0 
      x = x - 1 
      If x = -1 : x = 19 : y = (y + 1) % 2 : EndIf 
      temoinB = 1 
      ctrB = ElapsedMilliseconds() 
    EndIf 
  Else 
    temoinB = 0 
  EndIf 
  
  If KeyboardReleased(#PB_Key_F1) And (KeyboardReleased(#PB_Key_LeftControl) Or KeyboardReleased(#PB_Key_RightControl)) 
    If Not temoinLIGHT 
      light.s = Chr(7) 
      WriteSerialPortString(0, light, #PB_Ascii) 
      temoinLIGHT = 1 
    EndIf 
  Else 
    temoinLIGHT = 0 
  EndIf 
  
  If KeyboardReleased(#PB_Key_Right)
    If Not temoinL Or ElapsedMilliseconds() - ctrR >= 250 
      x = (x + 1) % 20 
      blackit = -1 
      temoinL = 1 
      ctrR = ElapsedMilliseconds() 
    EndIf 
  Else 
    temoinL = 0 
  EndIf 
  
  If KeyboardReleased(#PB_Key_Left) 
    If Not temoinR Or ElapsedMilliseconds() - ctrL >= 250 
      x = x - 1 
      If x = -1 : x = 19 : EndIf 
      blackit = -1 
      temoinR = 1 
      ctrL = ElapsedMilliseconds()  
    EndIf 
  Else 
    temoinR = 0 
  EndIf 
  
  If KeyboardReleased(#PB_Key_Up) Or KeyboardReleased(#PB_Key_Down)
    If Not temoinUD Or ElapsedMilliseconds() - ctrUD >= 250 
      y = (y + 1) % 2 
      blackit = -1 
      temoinUD = 1 
      ctrUD = ElapsedMilliseconds() 
    EndIf 
  Else 
    temoinUD = 0 
  EndIf 
Until event = #PB_Event_CloseWindow 
; IDE Options = PureBasic 4.30 (Windows - x86) 
; CursorPosition = 81 
; FirstLine = 67 
; Folding = - 
; EnableXP 
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Tu as testé en mode ThreadSafe ?
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

[Résolu] des touches fantômes

Message par KrisJNT »

Merci beaucoup !!! Je ne sais pas pourquoi... mais effectivement, ça fonctionne ! :D :D :D
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Quand ton programme utilises des thread, il est recommandé d'activer cette option cf la doc :
PureBasic a une option spéciale de compilation pour créer des exécutables multi-threadés (Le switch /THREAD pour le compilateur en ligne de commande ou l'option "Créer un exécutable multi-threadé" dans les options de compilation de l'IDE). Sans cette option, certaines fonctions (ainsi que la gestion des strings) sont plus rapides, mais inutilisables dans les threads. Il est toujours possible de créer des threads sans être dans ce mode, mais ce n'est pas recommandé, car même une simple manipulation de chaîne de caractères dans un thread peut être dangereux et doit être protégé. Activer cette option rend tout cela possible, mais au prix d'une diminution de la rapidité d'exécution. La décision de compiler en mode threadé doit donc être prise uniquement si le besoin s'en fait sentir.
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

[Résolu] Des touches fantômes

Message par KrisJNT »

J'avais pas tout lu... :oops:

Mais merci encore ! Je ne pensais pas que ça pouvait influencer à ce point !

[Résolu]
Répondre