Как читать / писать на консоли одновременно с использованием потоков - PullRequest
0 голосов
/ 19 сентября 2011

Я хочу реализовать консольное приложение C #, которое запускает симуляцию. Также я хочу дать пользователю возможность ускорять / замедлять скорость симуляции, нажимая «+» или «-» на консоли.

Есть ли способ прочитать консоль во время записи на ней? Я думаю, что мог бы использовать многопоточность для этого, но я не знаю, как это сделать (я все еще новичок в C #).

Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 19 сентября 2011

Вы можете проверить Console.KeyAvailable до вызова Console.ReadKey(). Это позволит вам проверить консоль на предмет ожидания ввода (т. Е. Пользователь нажал + или -) без блокировки . Если вы просто не пытаетесь читать, если нет доступных входных данных, ваш основной поток никогда не будет блокировать ожидание пользователя.

Используя этот механизм, вы можете сделать это в однопоточном приложении.

0 голосов
/ 19 сентября 2011

Да, есть способ чтения / записи в одно и то же время. Есть несколько способов сделать это:

Использовать другую тему:

Сначала вы запускаете поток, отвечающий за запись в консоль.

Thread t = new Thread(()=>{RunSimulation();});
t.IsBackground = true;
t.Start();

Метод моделирования будет выглядеть примерно так:

public void RunSimulation()
{
    while(running)
    {
        // Puts the thread to sleep depending on the run speed
        Thread.Sleep(delayTime);
        Console.WriteLine("Write your output to console!");
    }
}

Во-вторых, вы можете постоянно разрешать основному потоку опрашивать вводимые пользователем данные для внесения изменений.

string input = string.Empty;

while(input.Equals("x", StringComparison.CurrentCultureIgnoreCase)
{
    input = Console.ReadKey();
    switch(input)
    {
    case "+":
        // speeds up the simulation by decreasing the delayTime
        IncreaseSpeed();
        break;
    case "-":
        // slows down the simulation by decreasing the delayTime
        DecreaseSpeed();
        break;
    default:
        break;
    }
}

Использование таймера:

Другой подход заключается в использовании Timer и настройке частоты обратных вызовов по таймеру вместо регулировки времени ожидания в потоке:

// Create the timer
System.Timers.Timer aTimer = new System.Timers.Timer(10000);

// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnPrintSimulationResult);

// Change the Interval to change the speed of the simulation
aTimer.Interval = 2000; // <-- Allows you to control the speed of the simulation
aTimer.Enabled = true;

Конечно, вы должны иметь дело с безопасностью потоков, но это должно дать вам достойное место для начала. Вы можете вернуться, как только попробуете один из этих подходов, и у вас возникнет конкретная проблема, я уверен, что люди будут рады решить любые ваши конкретные проблемы. Обратите внимание, что это не будет очень изящно выглядящим решением сделать это в консоли, но это будет работать. Если вы хотите что-то более изящное, просто создайте приложение с графическим интерфейсом, которое имеет текстовую область, перенаправьте консольный вывод в текстовую область и добавьте 2 кнопки (+/-) для регулировки скорости.

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