2010-12-18 11 views
10

में एक कुंजी प्रेस के लिए कैसे प्रतीक्षा करें, जब उपयोगकर्ता कुंजी दबाता है तो मैं लूप से बाहर निकलना चाहता हूं।क्लोजर

सी में मैं kbhit() का उपयोग करता हूं। क्या कोई क्लोजर (या जावा) बराबर है?

+1

आप किस प्रकार का आवेदन करते हैं? कंसोल, स्विंग, servlets? – ffriend

+0

बस कंसोल से या अन्यथा कंसोल का उपयोग कर आरईपीएल से। – justinhj

+1

नया धागा ('एजेंट', 'भविष्य', 'थ्रेड' या जो कुछ भी आप उपयोग करते हैं) शुरू करें, जो वास्तविक प्रसंस्करण करेगा, थ्रेड वैरिएबल को 'मुख्य' इनपुट से पढ़ें, और जब यह खाली नहीं होगा, तो अपने समर्पित थ्रेड को रोकें । यदि आप केवल आरईपीएल में खेल रहे हैं, [यह] (http://www.objectcommando.com/blog/2010/06/10/clojure-futures/) आपकी आवश्यकताओं को पूरी तरह से कवर करेगा। – ffriend

उत्तर

2

आप जावा में एक (लिनक्स?) कंसोल में एक कुंजी प्रेस के संचालन को अनब्लॉक करने की तलाश में हैं। एक earlier question ने दो जावा पुस्तकालयों का सुझाव दिया जो इसे सक्षम कर सकते हैं। यदि इसे पोर्टेबल होने की आवश्यकता नहीं है, तो समाधान here है।

मूल रूप से

,

public class Foo { 
    public static void main(String[] args) throws Exception { 
    while(System.in.available() == 0) { 
     System.out.println("foo"); 
     Thread.sleep(1000); 
    } 
    } 
} 

काम करता है, लेकिन (लिनक्स पर) केवल 'वापसी' दबाने के बाद, क्योंकि सांत्वना InputStream बफ़र जाता है और है कि ओएस द्वारा निर्णय लिया गया है। इसका मतलब है कि आप चैनल या किसी अन्य एनआईओ कक्षा का उपयोग कर उस पर काबू पा सकते हैं। यह सुनिश्चित करने के लिए कि कंसोल प्रत्येक चरित्र को फहराता है, आपको टर्मिनल सेटिंग्स को संशोधित करने की आवश्यकता है। मैंने एक बार एक सी प्रोग्राम लिखा था जो करता है (वर्तमान टर्मिनल की टर्मियोस स्ट्रक्चर के आईसीएएनओएन ध्वज को संशोधित करता है), लेकिन मुझे नहीं पता कि जावा से ऐसा कैसे करें (लेकिन the second link देखें)।

सामान्य रूप से, आप 'जावा नॉनब्लॉकिंग इनपुट' के लिए searching द्वारा इस समस्या में कुछ और पा सकते हैं।