С#, System.Console

bleyman

У меня вдруг возникло вполне простое и понятное желание - узнать, а не попытался ли юзер что-нить ввести. В консольном приложении. Ну то есть прога работает, работает, периодически завершает очередную итерацию, и, если юзер чё-нить нажал, то она могла бы не считать дальше, а поинтересоваться не нужно ли ему чего.
Как?
Да, свои гениальные идеи (через треды, попиздить у консоли стрим и у него делать неблокирующее чтение) желательно вначале проверять а потом озвучивать.
Спасибо.

gopnik1994

на вопрос в таком тоне хочется и ответить соответствующе...

bleyman

Извини, просто я часа три ебался, и если бы мне кто-нибудь предложил взять стрим из Console.In я бы мог просто не сдержаться

Julie16

А чем не подходит еще один тред? Или я не догоняю?

freezer

гм... писать на manager c++ и юзать обычную консоль?..

bleyman

Фишка в том, что всякие разные Thread.Abort кидают ThreadAbortException в тот тред, который надо прекратить, но если он в этот момент находится в Console.ReadLine, то пока юзер не нажмёт ентер, этот эксепшен наружу не вылезет, и тред, соответствено не убьется. Очень забавно выглядит. Вот, поэтому надо тогда считывающий тред делать как раз основным, а считать и статистику выводить в другом. Но тогда это всё будет страшно некрасиво выглядеть, хотя по ходу именно так и придётся сделать, если я эту хрень не побежу. Или вторую консоль открыть =)
Хотелось бы чтобы выглядело это так: прога считает, рисует разные точечки етс., тут юзер жмёт какую-нить кнопку, поскольку прога ничего не вводит, кнопка так и остаётся в буфере (и на экран не попадает но как только очередная итерация завершается, прога узнаёт что у неё keystroke pending, и вызывает наконец ReadLine.
Странно это всё, короче. Щаз попробую действительно вычисления в другой тред засунуть, может быть это будет не так ужасно...

bleyman

Ни разу не пробовал манагед С++ и как-то не горю желанием. Кроме того, что-то я сомневаюсь, что там есть "обычная консоль" =)

freezer

а зачем тебе вообще консоль?

Dasar

Console.KeyAvailable
Console.ReadKey

bleyman

>Console.KeyAvailable
>Console.ReadKey
Это что?
Да, фреймворк 1.1, на всякий случай.
2Атилла - ну типа для моих текущих целей вполне подходит юникс-вей. Почти. Ну то есть понятно, что если проге скармливают данные из файла, то этот самый детект надо выключить. А когда за терминалом пользователь, хочется некоторой интерактивности.
Ой, маза, мб стоило попытаться ctrl-Break отловить?
Лана, вопрос закрыт, я уже вынес все вычисления в другой тред. Вроде работает.

Dasar

> Это что?
> Да, фреймворк 1.1, на всякий случай
оказалось, что это фреймоворк 2.0

bleyman

Ага. Ясно, буду знать, что где-то впереди есть светлое будущее, спасибо!

bleyman

Короче! Я нашёл в примере на System.GC.KeepAlive установку хендлера на ctrl+Break. Очень мазёво получилось. Оказывается, у винды весьма пёздая консоль, очень много интересных функций кругом неё бродит. Например, можно мышиные мессаги ловить консолью - то есть они будут в каком-то формате слаться в тот же стдин, правда, его читать нужно какой-то специальной функцией, чтобы их не отфильтровало. Вот.

sergey_m

Ты хочешь сделать unix way? Судя, по содержимому треда это не так просто сделать во враждебной среде.
Оставить комментарий
Имя или ник:
Комментарий: