2012-08-02 25 views
8

Konsol programımın çok sayıda uzun işlem gerçekleştirdiğini varsayın. Bu görevler arasında, herhangi bir tuşa basılıncaya kadar birkaç saniye süreyle veya duraklatılmasını istiyorum. (Hangisi önce gelir.)Keypress (veya) N Saniye'nin Sona Ermesi Bekleyin

Bu kriterler kendi başlarına kontrol etmek kolaydır, ama onları birleştiren çalıştıklarında geçinmeye çöp: Ya ReadKey, veya Readkey blokları başlamadan önce zamanlama mekanizması birkaç saniye duraklar iş parçacığı tamamen memnun olana kadar. Her iki durumu nasıl tatmin edebilirim?

+3

http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console- readline – dugas

+0

Herhangi bir örnek var mı? Bu, sadece bu işin yapıldığı ana ipucunu bildirebiliyormuş gibi geliyor, sonra devam edene kadar bekleyiniz, herhangi bir zamanlayıcıyı takip etmeli ve klavye basılırsa durduruyor ancak örnek olarak detaylandırılamıyorsa –

cevap

15

bir yolu C# 4.0 bunu yapmak için: Bunu yapmak için

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

Kaynak, daha sonra 'Bekle' çağrısının sonucunu bir boole değişkenine kaydedin. Eğer zaman aşımına uğradıysa, yanlış geri dönecek, aksi takdirde doğru olacaktır (yani bir anahtar mevcut). – SPFiredrake

+3

Çok fazla adımı olmayan kısa ömürlü konsol uygulamaları için muhtemelen bu yaklaşımı kullanmanız gerektiğini eklemeliydim, çünkü "zaman aşımına uğradı" yolu her alındığında, bir zombi ipliği oturmak için bir anahtar bekliyor. basın. Bunu 10.000 sayım döngüsünde denemeyin! – lesscode

+0

@Wayne Bu iyi bir nokta, bunu düşünmemiştim. (Ve bunu defalarca kullanmayı planlıyorum) Onların birikmesini önlemek için herhangi bir adım atmalı mıyım? – 4444

0

İki iş parçacığı başlatır. Biri bir süre için tuşa basmayı ve diğer beklemeleri dinler. Herhangi bir işlem yapılmadıkça beklemek için ana iş parçacığı yapın. Ardından diğer iş parçacığı yanıtını devam ettirin ve yoksayın. :)

3

Tek yön olan bir zamanlayıcı olmadan hiç. Iş parçacığı 25 milisaniye için uyku yapar bir döngü oluşturun ve sonra bir anahtar Console.KeyAvailable (engelleme olmayan) aracılığıyla veya DateTime.Now() arasındaki süre ve döngü başlangıcı zaman aşımı zaman aşımı zaman aşımı kadar olup olmadığını denetler. .

+0

Program çalışırken sistem zamanı değiştiyse, bu düzgün çalışmayacaktır. olacak mı –

0

Böyle bir şey mi var? Ikh cevabı dan genişletilmesi

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

Ben benimki ile aşağı sayımını istedi

 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); 
İlgili konular