2017-07-31 59 views
0

尋求一些關於如何在我的應用程序中解決這個問題的幫助/指導。在閱讀各種網站上的幾篇論壇帖子之後,我想我有一個關於爲什麼這不起作用的想法,但我不確定爲什麼在我的應用程序中發生這種情況以及如何實施解決方案。處理:Java,KeyPressed()沒有檢測到運行函數?

尋找應用程序,等待用戶通過鍵盤通過keyPressed()函數接收到響應。我將應用程序分離爲幾個函數(有些未在此處顯示),並且正在等待runTrialEvent()中的while循環中的響應。但是,一旦我運行runTrialEvent()函數,響應永遠不會被拾取。我知道這是問題所在,但不完全明白原因。

我在一個名爲runTrialEvent()的函數中有下面的代碼,它是通過按下鍵盤上的'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 "); 

} 
} 

我的平局()僅僅是一個窗口上寫的文字,所以沒有什麼是運行在那裏。如果任何人有任何解決方案將是偉大的。任何解釋爲什麼發生這種情況將不勝感激。

謝謝!

回答

1

處理使用單個線程來運行其所有功能。這意味着如果你讓一個函數永遠運行,其他函數將永遠不會有機會觸發。

請嘗試發佈一個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或者任何庫。請嘗試從現在開始張貼這樣的代碼。)

反正我們怎麼解決這個問題?您可以創建第二個線程來處理您的處理,但這可能是爲了您的目的矯枉過正。

相反,您需要重構代碼以完全消除繁忙等待。一種方法是使用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()函數,因爲它阻止了其他函數被觸發。相反,重構你的代碼以完全消除等待。

+0

嗨,感謝您的回覆,現在就多瞭解一下。只是爲了澄清,很大一部分代碼並未包含在內。我有一個serialEvent()和其他函數可以完美地處理Arduino的輸入,這讓我很困惑,因爲我可以在另一個函數中接收它並將它傳遞給runTrialEvent(),但在此函數運行期間無法檢測keyPressed輸入? – user3212628

+0

@ user3212628如果您發佈一個小[mcve]而不是斷開連接的片段(但請注意,這應該不是**完整草圖),您將擁有更好的運氣。但是無論如何,基本思想都是一樣的:如果你將一個函數與忙等待並調用'delay()',你的其他函數將沒有機會觸發。 –

+0

嗨,很好的解釋,爲格式道歉,希望包括儘可能多的信息,以幫助人們理解,但也有負面影響太多。就你所描述的解決方案而言,我可以怎樣去做我的應用程序。我必須在定時器用完之前收到用戶的響應,我的理由是爲什麼我使用了一個while循環。任何想法如何我會去創建另一個線程? – user3212628