处理:Java,KeyPressed()在运行函数时没有检测到?

时间:2017-07-31 20:56:33

标签: java while-loop keyboard processing

寻求有关如何在我的应用程序中解决此问题的一些帮助/指导。在阅读了各个网站上的几篇论坛帖子后,我想我已经知道为什么这不起作用,但我不确定为什么在我的应用程序中发生这种情况以及如何实现解决方案。

寻找应用程序,等待用户通过keyPressed()函数通过键盘收到响应。我已将应用程序分成几个函数(这里没有显示),并且在runTrialEvent()中的while循环中等待响应。但是,一旦运行runTrialEvent()函数,就不会获取响应。我知道这就是问题所在,但并不完全明白为什么。

我在一个名为runTrialEvent()的函数中有以下代码,该函数是通过按下&t; t'在键盘上。

runTrialEvent()

 void runTrialEvent(Serial myPort) 
 {

      //////////////////////////////////////////////
      //This While Loop is where the issues arise

      while (trialTimer.isFinished() == false && userResponded == false )
      {
        println("Awaiting User Response");

        delay (300);
      }

      //////////////////////////////////////////////////     

      if (userResponded == true)
      {
        //Debug Info
        println("User responded in time ");   
      }

      else if (trialTimer.isFinished() == true)
      {
         println("User failed to respond in time ");
      }
}

我有来自用户的输入使用keyPressed(),它在循环之前正常工作。这段代码是:

的keyPressed()

 void keyPressed() 
 {
 if (key == 'f' || key == 'F' )
 {
   println("User Answered First");
   //allTrials[i].setUserAnswer("F");
   userResponded = true;
   println("User Response Recorded ");

 }

 else if (key == 's' || key == 'S')
 {
   println("User Answered Second");
   //allTrials[i].setUserAnswer("S");
   userResponded = true;
   println("User Response Recorded ");

 }
 }

我的draw()只是在窗口上写文本,所以没有任何东西在那里运行。如果有人有任何解决方案会很棒。任何解释为什么会发生这种情况将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

Processing使用单个线程来运行其所有功能。这意味着如果你让一个函数永远运行,其他函数永远不会有机会发射。

请尝试以尽可能少的行发布显示问题的MCVE,同时完整,我们可以自行复制和粘贴。这是一个显示问题的示例程序:

String text = "";

void draw(){
  background(64);
  textAlign(CENTER, CENTER);
  text(text, width/2, height/2);
}

void keyPressed(){
  text += key;
}

void mousePressed(){

  while(!text.equals("hello")){
    println("Waiting for text to equal hello.");
    delay(1000);
  }

}

这个程序正在做一些非常类似于你想要做的事情。它使用keyPressed()函数来处理输入,然后mousePressed()函数检查和忙等待,使文本等于某个字符串。你可能希望这个忙 - 等到用户键入你好。

如果您运行此功能,您会注意到keyPressed()功能正常,直到您单击鼠标。此时它等待文本等于hello,但这种情况从未发生过,因为现在keyPressed()函数从未触发过。

(注意这个程序如何在没有任何额外代码且不需要Arduino或任何库的情况下显示您的问题。请尝试从现在开始发布这样的代码。)

无论如何,我们如何解决这个问题?你可以创建一个处理你的处理的第二个线程,但这对你的目的来说可能有些过分。

相反,您需要重构代码以完全消除繁忙的等待。一种方法是使用boolean变量来跟踪您是否已收到数据。用它来检查是否需要执行某些操作,然后在收到数据时进行设置。

以下是我们的小示例程序中的方法:

String text = "";
boolean helloReceived = false;

void draw(){
  background(64);
  textAlign(CENTER, CENTER);
  text(text, width/2, height/2);
}

void keyPressed(){
  text += key;

  if(text.equals("hello")){
     helloReceived = true; 
  }
}

void mousePressed(){

  if(helloReceived){
    println("Text now equals hello!");
  }
}

现在,代码使用helloReceived变量来跟踪条件是否已满足。这有点做作,但我试图创建一个类似于你想要做的例子。

此代码只是一个示例,您的实际代码可能需要比单个boolean值更复杂一些。但一般的答案是相同的:你不应该忙 - 等待或使用delay()函数,因为它可以防止其他函数被触发。相反,重构代码以完全消除等待。