2012-08-02 26 views
8

मान लीजिए कि मेरा कंसोल प्रोग्राम कई लंबा कार्य करता है। इन कार्यों के बीच, मैं इसे रोकना चाहता हूं - या तो कुछ सेकंड या तक जब तक कोई भी कुंजी दबाया न जाए। (जो भी पहले हो।)कुंजीपटल (या) एन सेकेंड के लिए प्रतीक्षा करें

इन मानदंडों को अपने दम पर जाँच करने के लिए आसान है, लेकिन वे जब मैं उन्हें संयोजन की कोशिश साथ पाने के लिए मना कर दिया: या तो पहले ReadKey, शुरू होता है या Readkey ब्लॉक समय तंत्र कुछ सेकंड के लिए रुक जाता है पूरी तरह से संतुष्ट होने तक धागा बाहर। मैं दोनों स्थितियों को कैसे संतुष्ट कर सकता हूं?

+3

http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console- रीडलाइन – dugas

+0

कोई उदाहरण उपलब्ध है? ऐसा लगता है जैसे आप केवल मुख्य धागे को सूचित कर सकते हैं कि यह किया जाता है, फिर जब तक आप जारी रख सकें तब तक प्रतीक्षा करें, किसी भी टाइमर का ट्रैक रखें और कीबोर्ड दबाए जाने पर इसे रोकें, लेकिन उदाहरण के बिना विस्तृत नहीं कर सकते –

उत्तर

15

एक तरीका यह में सी # 4.0 करने के लिए। एक लूप बनाएं जो थ्रेड को 25 मिलीसेकंड कहने के लिए नींद देता है, और उसके बाद जांच करता है कि Console.KeyAvailable (जो गैर-अवरुद्ध है) के माध्यम से एक कुंजी दबाई गई है, या DateTime.Now() के बीच के समय तक और लूप की शुरुआत का समय टाइमआउट से अधिक हो गया है ।

+1

यदि आपको पता होना चाहिए स्रोत, फिर बस 'प्रतीक्षा' कॉल के परिणाम को एक बूल वैरिएबल में सहेजें। यदि यह समय समाप्त हो गया है, तो झूठी वापसी होगी, अन्यथा सच हो जाएगा (जिसका अर्थ है कि एक कुंजी उपलब्ध है)। – SPFiredrake

+3

मुझे यह जोड़ना चाहिए था कि आपको शायद अल्पकालिक कंसोल ऐप्स के लिए केवल इस दृष्टिकोण का उपयोग करना चाहिए जिसमें कई कदम नहीं हैं, क्योंकि प्रत्येक बार "टाइम आउट" पथ लिया जाता है, वहां एक ज़ोंबी थ्रेड एक कुंजी के लिए प्रतीक्षा कर रहा होगा दबाएँ। 10,000 गिनती पाश के अंदर यह कोशिश मत करो! – lesscode

+0

@Wayne यह एक अच्छा मुद्दा है, मैंने इसके बारे में सोचा नहीं था। (और मैं इसे कई बार इस्तेमाल करने की योजना बना रहा हूं) क्या मुझे उन्हें पिलिंग से रोकने के लिए कोई कदम उठाना चाहिए? – 4444

0

दो धागे शुरू करें। एक कुंजीपटल के लिए सुनता है और कुछ समय के लिए इंतजार कर रहा है। जब तक कोई भी नहीं किया जाता है तब तक प्रतीक्षा करने के लिए मुख्य धागा बनाएं। फिर आगे बढ़ें और अन्य थ्रेड प्रतिक्रिया को अनदेखा करें। है एक टाइमर के बिना सब पर

Task.Factory.StartNew(() => Console.ReadKey()).Wait(TimeSpan.FromSeconds(5.0)); 
3

एक तरह से यह करने के लिए: :)

+0

यदि प्रोग्राम चल रहा है, तो सिस्टम समय बदल गया है, तो यह सही तरीके से काम नहीं करेगा, यह होगा? –

0

ऐसा कुछ?

bool IsPaused; 
bool IsKeyPaused; 

void Pause(){} 
void UnPause(){} 

void KeyDown(){ 
    if(!IsPaused) 
    { 
     IsPaused = true; 
     IsKeyPaused = true; 
     Pause(); 
    } 
} 
void KeyUp(){ 
    if(IsKeyPaused) 
    { 
     IsPaused = false; 
     IsKeyPaused = false; 
     UnPause(); 
    } 
} 
void TimerPause(){ 
    if(!IsPaused) 
    { 
     IsPaused = true; 
     Pause(); 
    } 
} 
void TimerEnd(){ 
    UnPause(); 
} 
2

ikh के जवाब से विस्तार मैं मेरा साथ नीचे गिनती चाहता था

 var original = DateTime.Now; 
     var newTime = original; 

     var waitTime = 10; 
     var remainingWaitTime = waitTime; 
     var lastWaitTime = waitTime.ToString(); 
     var keyRead = false; 
     Console.Write("Waiting for key press or expiring in " + waitTime); 
     do 
     { 
      keyRead = Console.KeyAvailable; 
      if (!keyRead) 
      { 
       newTime = DateTime.Now; 
       remainingWaitTime = waitTime - (int) (newTime - original).TotalSeconds; 
       var newWaitTime = remainingWaitTime.ToString(); 
       if (newWaitTime != lastWaitTime) 
       { 
        var backSpaces = new string('\b', lastWaitTime.Length); 
        var spaces = new string(' ', lastWaitTime.Length); 
        Console.Write(backSpaces + spaces + backSpaces); 
        lastWaitTime = newWaitTime; 
        Console.Write(lastWaitTime); 
        Thread.Sleep(25); 
       } 
      } 
     } while (remainingWaitTime > 0 && !keyRead);