演员不记得州

时间:2017-08-02 12:11:37

标签: scala akka jnativehook

我正在尝试创建一个示例应用程序,该应用程序使用jNativeHook库监视Windows机器上scala的击键。

我有以下侦听事件的侦听器

object KeyListener extends org.jnativehook.keyboard.NativeKeyListener {

  val keyPressedActor = implicitly[ActorSystem].actorOf(Props[KeyPressedActor](), "KeyPressedActor")

  def nativeKeyPressed(event: NativeKeyEvent): Unit = {
    keyPressedActor ! event    
  }
 //blank override two more methods.
}

插入监听器的主要驱动程序应用程序

object ConsoleApp extends App {
  try {
    GlobalScreen.registerNativeHook();
    GlobalScreen.addNativeKeyListener(KeyListener)
  } catch {
    case nativehookException: NativeHookException => System.out.println("Encountered error while Hooking to global screen" + nativehookException.fillInStackTrace())
    case ex: Exception                            => System.out.println("Miserable ! Shouldn't have happened ." + ex.fillInStackTrace())
  }
}

这是我想要将关键笔划存储在某个集合中的actor的实现,

class KeyPressedActor extends Actor {
  var testQueue = new scala.collection.mutable.Queue[String]()

  def receive = {
    case event: NativeKeyEvent =>

      if (event.paramString().contains("modifiers=Ctrl")) {
         testQueue.enqueue("this_is_test")        
      }

    case _ => System.out.println("Bummer !  You are NOT supposed to see THIS !")
  }
}

现在我看到每次演员进入我们向队列添加字符串的块时,它都不记得插入其中的最后一个元素。

我无法理解为什么会这样。 如果我只有一个向演员发送消息的主应用程序,则不会出现此问题。 我无法理解为什么会发生这种情况。

更新:

实际上,我最初没有复制的部分中的代码还有其他内容。 所以,如果我在演员的if块中有这个,

NativeKeyEvent.getKeyText(event.getKeyCode) match {
          case "C" =>   
                        isCPressed = true
          case "V" => isVPressed = true
          case "N" => isNPressed = true

观察到这种行为。 我将此代码更改为此,

 val keyCode = NativeKeyEvent.getKeyText(event.getKeyCode)

        if (keyCode.equalsIgnoreCase("c")) {
         testQueue.enqueue("this_is_test")
        }

我想知道这是否意味着match语句正在某些不同的上下文/线程上运行???

0 个答案:

没有答案