2010-04-26 8 views
2

콘솔 앱의 경우 진행하기 전에 설정된 시간 (약 10 초) 동안 대기하여 사용자가 키 또는 키 세트를 입력하는 방법을 알아야합니다. 응용 프로그램의 '자동 실행'부분.사용자 입력 대기 시간 C# console app

타이머가 작동하는 방식을 이해할 수 없거나 threading.sleep을 사용하지 않으면이 문제가 발생합니다. 하루 종일 인터넷 검색 중입니다.

일부 psuedocode :

1.app이

2.app는 "K"키를 누르하는 사용자에 대해 10 초를 기다립니다 열립니다. 사용자가 K 안타 3.If는 사용자가 5

4.run에 기능을하지 않는 경우

은 무언가를 (

5.run 기능을 (양식을 열) 4로 이동)

나는 단순한 내기를했는데, 무슨 일이 벌어지고 있는지 이해할 수 없다.

+0

어떤 종류 : 정말

나는 다음과 같은 코드를 사용 .. 나에게 많은 도움이? WinForms? – SLaks

+0

콘솔 응용 프로그램입니까? 아니면 win-forms 응용 프로그램입니까? –

+0

좀 더 자세한 정보를 제공해주세요. "자동 실행"이란 무엇을 의미합니까? 앱이 어떻게 동작해야하는지에 대한 몇 가지 예를 들려 줄 수 있습니까? – Shoban

답변

3

10 초 타이머를 설정하지 않습니다.

타이머가 만료되면 이벤트가 시작됩니다.

이벤트 처리기에서 "자동 실행"섹션으로 진행하십시오.

타이머가 만료되기 전에 사용자가 키를 친다면 스레드를 강제 종료하십시오.

MSDN의 Timer class page에는 설정된 기간 동안 대기하는 타이머의 예가 있습니다.

+0

OK. 나는 이것이 도움이되었을 것이라고 생각한다! 내 뇌 – Marlon

+0

지금 확인 타이머 도중에 입력 키를 읽는 부분이 필요합니다. 나는 (KEY는 'K'와 같지 않다) LOOP을 가지고있다. 이걸 가져야하나요?나는 지금 변비를 프로그래밍하고있다. .. – Marlon

+0

@ Marlon - 그건 효과가 있지만 필요하지는 않다. 키 다운 핸들러가 있고 사용자가 "K"를 누르면 스레드가 중지됩니다. – ChrisF

0

트릭을 수행 할 몇 가지 코드는 다음과 같습니다.

 Form1 f = new Form1(); 
     System.Threading.Timer t = new System.Threading.Timer(o => f.Invoke(new Action(() => f.textBox1.Enabled = true)), null, 10000, System.Threading.Timeout.Infinite); 
     f.ShowDialog(); 
     t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
+0

답변 해 주셔서 감사합니다. 하지만 할당 된 시간에 사용자의 입력을 판단하는 곳을 알 수 없습니다. 어쩌면 내가 조금 내 질문을 변경해야합니다. : – Marlon

+0

예. 이제 질문이 훨씬 명확 해졌습니다. 내 대답은 편집 된 질문에 대한 해결책이 아닙니다 . –

1

콘솔 응용 프로그램을 사용하는 경우 가능한 답변은 here입니다.

+0

어이 바보입니다. 내가 연계 한 코드가 어떻게 작동하는지 이해할 수 없습니다. 당신이 나에게 설명해 줄 수 있겠습니까? – Marlon

+0

기본적으로 문제는 마이크로 소프트의 콘솔이 스레드에서 시작한 다음 그 스레드를 죽이는 경우에도 영원히 블로킹된다는 것입니다. 콘솔은 프로세스 당입니다. 그래서 제 코드는 실제로 2 개의 실행 파일을 가지고 있습니다 : 첫 번째는 콘솔에 반향하는 간단한 readline이고, 다른 하나는 주어진 시간 (초) 후에 시간 초과 한 쓰레드를 호출합니다. 클라이언트가 뭔가를 입력하기 전에 시간 초과에 도달하면, 그 app은 종료됩니다. 기본 (주어진 경우) 문자열이 반환됩니다. 도움이 되셨습니까? –

7

다음은 C# 콘솔 응용 프로그램에 대한 몇 가지 샘플 코드입니다. 타이머를 사용하지 않고 대신 절전 모드를 사용합니다. 타이머 기반 코드보다 이해하기가 쉽습니다.

 static void openForm() 
     { 
      Console.WriteLine("Form opened!"); 
     } 

     static void doSomething() 
     { 
      Console.WriteLine("Do something!"); 
     } 

     static void Main(string[] args) 
     { 
      bool optionForm = false; 
      int seconds = 1; 

      Console.Write("Press 'k' to open form"); 

      while (true) 
      {     
       if (Console.KeyAvailable) 
       { 
        ConsoleKeyInfo c = Console.ReadKey(true); 
        if (c.Key == ConsoleKey.K) 
        {       
         optionForm = true; 
         break; 
        } 
       } 

       System.Threading.Thread.Sleep(1000); 

       if (seconds++ > 10) 
        break; 

       Console.Write('.'); 
      } 

      Console.WriteLine(); 

      if (optionForm) 
       openForm(); 
      else 
       doSomething(); 

      Console.ReadKey(); 
     } 
+0

타이머를 사용하여 끝났지 만 멋지게 보입니다. – Marlon

1

감사합니다. Marlon !! 프로그램의

int minutes = 1; 
while (true) 
{ 
    if (Console.KeyAvailable) 
    { 
     ConsoleKeyInfo c = Console.ReadKey(true); 
    if (c.Key == ConsoleKey.Enter) 
    { 
      break; 
    } 
    } 
    Thread.Sleep(1000); 
    if (minutes++ > 10) 
    { 
    throw; 
    } 
}