Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2011, 14:00   #1
xata1988
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию Как в C# прервать работу цикла при нажатии клавиши

Есть цикл, например этот:

while(true)
{
Console.Write("Текст ");
}
Console.Write("Цикл завершился");
Console.ReadKey();


Цикл работает вечно. Нужно что бы он прерывался при нажатии какой то клавиши, например "Q" и продолжалась работа программы. Как это можно сделать? Помогите!!!
xata1988 вне форума Ответить с цитированием
Старый 14.02.2011, 14:09   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Console.ReadKey перенесите в цикл и там что-то вроде
Код:
keyKode = Console.ReadKey();
if ( keyKode == 27 ) 
{
  break;
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2011, 14:19   #3
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Вариант от Serge_Bliznykov немного не подходит, т.к. если его использовать, то на каждый проход цикла надо что-то вводить. Здесь надо использовать потоки. Т.е. свой цикл запускаешь в потоке, в цикле где-нить проверяешь переменную (напр. IsStopKeyPressed) если true то break. А на форме ловишь нажатие клавиш. Но этот вариант для форм, для консоли Ctrl+C сделает все за тебя.
Hollander вне форума Ответить с цитированием
Старый 14.02.2011, 14:25   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, коллега, не согласен, достаточно использовать метод KeyAvailable для проверки, если ли нажатая клавиша или нет?


вот пример использования из MSDN:
Код:
C#  Копировать код 
// This example demonstrates the Console.KeyAvailable property.
using System;
using System.Threading;

class Sample 
{
    public static void Main() 
    {
    ConsoleKeyInfo cki = new ConsoleKeyInfo();

    do {
        Console.WriteLine("\nPress a key to display; press the 'x' key to quit.");

// Your code could perform some useful task in the following loop. However, 
// for the sake of this example we'll merely pause for a quarter second.

        while (Console.KeyAvailable == false)
            Thread.Sleep(250); // Loop until input is entered.
        cki = Console.ReadKey(true);
        Console.WriteLine("You pressed the '{0}' key.", cki.Key);
        } while(cki.Key != ConsoleKey.X);
    }
}

или, для вышеприведённого примера:
Код:
            ConsoleKeyInfo cki = new ConsoleKeyInfo();

            while (true)
            {
                Console.Write("Текст ");
                if (Console.KeyAvailable == true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.Key == ConsoleKey.X)
                    {
                        break;
                    }
                }
            }
            Console.Write("Цикл завершился");
            Console.ReadKey();

Последний раз редактировалось Serge_Bliznykov; 14.02.2011 в 14:29.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2011, 14:38   #5
xata1988
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, коллега, не согласен, достаточно использовать метод KeyAvailable для проверки, если ли нажатая клавиша или нет?


вот пример использования из MSDN:
Код:
C#  Копировать код 
// This example demonstrates the Console.KeyAvailable property.
using System;
using System.Threading;

class Sample 
{
    public static void Main() 
    {
    ConsoleKeyInfo cki = new ConsoleKeyInfo();

    do {
        Console.WriteLine("\nPress a key to display; press the 'x' key to quit.");

// Your code could perform some useful task in the following loop. However, 
// for the sake of this example we'll merely pause for a quarter second.

        while (Console.KeyAvailable == false)
            Thread.Sleep(250); // Loop until input is entered.
        cki = Console.ReadKey(true);
        Console.WriteLine("You pressed the '{0}' key.", cki.Key);
        } while(cki.Key != ConsoleKey.X);
    }
}

или, для вышеприведённого примера:
Код:
            ConsoleKeyInfo cki = new ConsoleKeyInfo();

            while (true)
            {
                Console.Write("Текст ");
                if (Console.KeyAvailable == true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.Key == ConsoleKey.X)
                    {
                        break;
                    }
                }
            }
            Console.Write("Цикл завершился");
            Console.ReadKey();

спасибо!!)сначала не работало, поменял false на true и пошло. То что надо
xata1988 вне форума Ответить с цитированием
Старый 14.02.2011, 14:48   #6
xata1988
 
Регистрация: 14.02.2011
Сообщений: 7
По умолчанию

Код:
ConsoleKeyInfo cki = new ConsoleKeyInfo();

            while (cki.Key != ConsoleKey.LeftArrow)
            {
                Console.Write("Текст ");
                Console.Beep(37,500);
                if (Console.KeyAvailable == true)
                {
                    cki = Console.ReadKey(true);
                }
            }
            Console.Write("Цикл завершился");
            Console.ReadKey();

так даже лучше))


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 14.02.2011 в 15:35.
xata1988 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прервать работу конструктора объекта? teapot Общие вопросы C/C++ 15 05.12.2010 14:15
Закрытие окна при нажатии опр. клавиши на клавиатуре. Borgond Общие вопросы Delphi 6 25.08.2010 01:14
завершение цикла при нажатии клавиши LLIyPI/IK Общие вопросы C/C++ 8 12.02.2010 13:29
Обновление заданной области экрана при нажатии клавиши Jack Torrance Win Api 3 26.05.2008 10:57
Событие при нажатии клавиши Enter Inbox Общие вопросы Delphi 4 12.06.2007 14:18