как проверить стандартный ввод в C #, делая что-то - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть программа наподобие этой:

Class a
{
    main()
    {
        while(abc)
        {
            f(a);
            g(b);
        }
    }
}

, но мне нужно проверить стандартный ввод для некоторой важной команды.Программа должна работать, я получу команду от стандартного ввода.и после команды я должен решить продолжить выполнение или делать что-то еще.Что мне делать?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Выполнить f и g в разных потоках с некоторой переменной, к которой обе стороны обращаются для распространения изменения состояния.

Class Program
{
  public static void Main()
  {
    ThreadPool.QueueUserWorkItem(() => f(a));
    ThreadPool.QueueUserWorkItem(() => g(b));

    while(true)
    {
      if(Console.Readline() == "something")
        //do something
    }
  }

  private static void f (param)
  {
    while(abc)
      //do work
  }
}
1 голос
/ 07 апреля 2011

Это будет работать, если ваши команды состоят из одного символа.

Class a
{
    main()
    {
        bool done = false;
        Console.CancelKeyPress += (s, e) => { done = true; e.Cancel = true; };
        while(!done)
        {
            f(a);
            g(b);
            if (Console.KeyAvailable)
            {
                switch(Console.ReadKey().KeyChar)
                {
                    case 'i':
                    case 'I':
                        DoSomethingImportant();
                        break;
                    case 'E':
                    case 'e':
                        done = true;
                        break;
                }
            }
        }
    }
}

Если команды длиннее одного символа, вы можете сохранить ключи в буфере и искать выполненные команды при каждом нажатии клавиши.

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

(Я добавил обработку CTRL-C в приведенном выше коде, поэтому он будет корректно завершаться, если пользователь попытается остановить программу. Эта часть является необязательной.)

0 голосов
/ 07 апреля 2011

Насколько я понимаю, вам потребуется еще один поток, запускаемый перед циклом while, который может принимать команды от стандартного ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...