2013-06-06 5 views
-1

У меня есть эти два методыПроблемы с Multi-Threading

public void L1Timer() 
    { 
     Console.Clear(); 
     int score = tot; 
     Console.Write("Chances : " + ch); 
     Console.CursorLeft = 40; 
     Console.Write("Marks : " + score); 
     for (int time = 0; time <= 100000; time++) 
     { 
      Console.SetCursorPosition(65, 0); 
      Console.Write("Time Elapsed : " + time + " Secs"); 
      Console.CursorLeft = 40; 
      stime = time; 
      Thread.Sleep(1000); 
      Console.Beep(); 
      //Level1(); 
     } 
    } 

    public void Level1() 
    { 
     Console.WriteLine("\n\n"); 
     Console.CursorLeft = 40; 
     Console.WriteLine("C _ _ E _ _ _ T _ _ N"); 
     Console.WriteLine("\n\n"); 
     tot = 0; 
     while ((tot <= 70) && (ch > 0)) 
     { 
      Console.Write("Guess : "); 
      string gues = Console.ReadLine(); 
      switch (gues) 
      { 
       case "E": tot += 10; ch--; L1Timer(); Level1(); break; 
       case "L": tot += 10; ch--; break; 
       case "B": tot += 10; ch--; break; 
       case "R": tot += 10; ch--; break; 
       case "A": tot += 10; ch--; break; 
       case "I": tot += 10; ch--; break; 
       case "O": tot += 10; ch--; break; 
       default: tot += 0; ch--; break; 
      } 
      Console.WriteLine(); 
     } 
    } 

Я хочу, чтобы выполнить первый метод первым, а затем приступить к выполнению второго с первым таймером метода все еще рассчитывает без задержки второго потока ... Я попытался это

  Thread T1 = new Thread(new ThreadStart(L1Timer)); 

      Thread T2 = new Thread(new ThreadStart(Level1)); 

      T1.Start(); 

      T2.Start(); 

но это не сработало так, как я хочу it..It excuted первый и второй, но забрал курсор на первый метод, который не позволит пользователю ввести во втором методе и ответьте на вопрос ... Pls поможет мне

+3

Вы пригласив тупики путем доступа к консоли из различных потоков. – spender

+0

Pls, что я могу сделать вместо ???? –

+1

Вы должны изучить класс [BackgroundWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx). У меня был [аналогичный вопрос] (http://stackoverflow.com/questions/1890518/wpf-multithreaded-progress-dialog) в работе с приложением WPF, которое может вам помочь. – Joe

ответ

0

Вот основная идея: Console Word Game Example

запустить его и посмотреть время, прошедшее в верхнем правом углу. Хит несколько букв и проверить счет/шансы. Hit Escape, затем «q» или «r», и посмотрите, что произойдет.

Это простой пример демонстрации потока для «причудливого» консольного интерфейса. Я не придавал почти никакой реальной логики этой «игре», о которой вы уже не писали в своем оригинальном вопросе; поэтому я не считаю это «выполнением вашей домашней работы для вас». Это просто «пух» на вершине игры. Реальное задание, вероятно, приведет к тому, что логика игры будет установлена ​​в Класс. Если вы объявляете этот экземпляр класса статичным, как я сделал с переменными «Оценка» и «Шансы», тогда различные подпрограммы, кроме Main(), могут получить к нему доступ и обновить экран, используя значения из вашего игрового состояния. Разработка класса для представления Правления, а текущее состояние игры обычно является ядром задания и где ваш фокус должен действительно лежать.

Надеется, что это помогает ...

class Program 
{ 

    static int Score = 0; 
    static int Chances = 10; 
    static int promptX, promptY; 
    static string board = "{No Board Loaded}"; 
    static System.Diagnostics.Stopwatch SW = new Stopwatch(); 

    static void Main(string[] args) 
    { 
     ConsoleKeyInfo cki; 
     Console.Title = "Some Word Game"; 

     bool quit = false; 
     bool gameWon = false; 
     bool gameOver = false; 

     while (!quit) 
     { 
      Reset(); 
      ShowBoard("C _ _ E _ _ _ T _ _ N"); 

      gameWon = false; 
      gameOver = false; 
      while (!gameOver) 
      { 
       UpdateStats(); 

       // make it appear as though the cursor is waiting after the prompt: 
       Console.SetCursorPosition(promptX, promptY); 
       if (Console.KeyAvailable) 
       { 
        cki = Console.ReadKey(true); // don't display key 
        if (cki.Key == ConsoleKey.Escape) 
        { 
         gameOver = true; 
        } 
        else 
        { 
         // if it's A thru Z... 
         if (char.IsLetter(cki.KeyChar)) 
         { 
          string key = cki.KeyChar.ToString().ToUpper(); 
          Console.Write(key); 
          switch (key) 
          { 
           case "E": 
            Score += 10; 
            Chances--; 
            break; 

           case "L": 
            Score += 10; 
            Chances--; 
            break; 

           case "B": 
            Score += 10; 
            Chances--; 
            break; 

           case "R": 
            Score += 10; 
            Chances--; 
            break; 

           case "A": 
            Score += 10; 
            Chances--; 
            break; 

           case "I": 
            Score += 10; 
            Chances--; 
            break; 

           case "O": 
            Score += 10; 
            Chances--; 
            break; 

           default: 
            Score += 0; 
            Chances--; 
            break; 
          } 

          // ... possibly update the board somehow in here? ... 
          // ... some board logic ... 
          // ShowBoard("updated board in here"); 

          // set gameOver to drop out of loop 
          // also set gameWon if the user beat the board 

         } 
         else 
         { 
          Console.Write(" "); 
         } 

        } 
       } 

       System.Threading.Thread.Sleep(200); 
      } 

      if (gameWon) 
      { 
       // ... do something ... 
      } 
      else 
      { 
       // ... do something else ... 
      } 

      quit = QuitProgram(); 
     } 
    } 

    static void Reset() 
    { 
     // reset game variables and clock: 
     Score = 0; 
     Chances = 10; 
     SW.Restart(); 

     Console.Clear(); 
     CenterPrompt("Guess: "); 
     promptX = Console.CursorLeft; 
     promptY = Console.CursorTop; 
    } 

    static void ShowBoard(string NewBoard) 
    { 
     board = NewBoard; 
     Console.SetCursorPosition(Console.WindowWidth/2 - board.Length/2, promptY - 2); 
     Console.Write(board); 
    } 

    static void UpdateStats() 
    { 
     // hide cursor while we update the stats: 
     Console.CursorVisible = false; 

     Console.SetCursorPosition(0, 0); 
     Console.Write("Score: " + Score.ToString("000")); 

     Console.SetCursorPosition(35, 0); 
     Console.Write("Chances: " + Chances.ToString("00")); 

     TimeSpan ts = SW.Elapsed; 
     string totalTime = String.Format("Time Elapsed: {0}:{1}:{2}", ts.Hours, ts.Minutes.ToString("00"), ts.Seconds.ToString("00")); 
     Console.SetCursorPosition(Console.WindowWidth - totalTime.Length, 0); 
     Console.Write(totalTime); 

     // ... add other output statistics in here? ... 

     // turn cursor back on for the prompt: 
     Console.CursorVisible = true; 
    } 

    static void CenterPrompt(string message) 
    { 
     Console.SetCursorPosition(Console.WindowWidth/2 - message.Length/2, Console.WindowHeight/2); 
     Console.Write(message); 
    } 

    static bool QuitProgram() 
    { 
     Console.Clear(); 
     CenterPrompt("Thanks for playing! Press 'q' to Quit, or 'r' to Retry."); 
     while (true) 
     { 
      if (Console.KeyAvailable) 
      { 
       ConsoleKeyInfo cki = Console.ReadKey(true); 
       switch (cki.KeyChar.ToString().ToUpper()) 
       { 
        case "Q": 
         return true; 

        case "R": 
         return false; 

       } 
      } 
     } 
    } 

} 
+0

Спасибо, но когда я запустил приложение, таймер не считал –

+0

Не уверен, что вы сделали неправильно. Вы начали с ** нового, пустого ** проекта консоли и вставьте этот код над ним? –