处理:Java,KeyPressed() 未检测到 运行 功能?

Processing: Java, KeyPressed() Not Detecting Whilst Running Function?

正在寻找 help/guidance 如何在我的应用程序中解决这个问题。在阅读了各个网站上的几篇论坛帖子后,我想我知道为什么这不起作用,但是我不确定为什么会在我的应用程序中发生这种情况以及如何实施解决方案。

寻找应用程序等待,直到通过键盘通过 keyPressed() 函数从用户收到响应。我已将应用程序分成几个函数(此处未显示一些函数),并在 运行TrialEvent() 的 while 循环中等待响应。但是,一旦我 运行 运行TrialEvent() 函数,就永远不会收到响应。我知道这是问题所在,但不完全理解为什么。

我在名为 运行TrialEvent() 的函数中有以下代码,通过按键盘上的 't' 运行。

运行试用事件()

 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() 只是在 window 上写入文本,因此 运行 那里什么也没有。如果有人有任何解决方案会很棒。任何关于为什么会发生这种情况的解释将不胜感激。

谢谢!

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

请尝试 post 一个 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() 函数检查 并忙等待 文本是否等于某个字符串。您可能希望这会忙等到用户输入 hello。

如果你运行这个函数,你会注意到keyPressed()函数工作正常,直到你点击鼠标。那时它一直在等待文本等于 hello,但这从来没有发生过,因为现在 keyPressed() 函数永远不会触发。

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

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

相反,您需要重构代码以完全消除忙等待。一种方法是使用 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() 函数,因为它会阻止其他函数被触发。相反,重构您的代码以完全消除等待。