[C#] Timer в консольном приложении
Это не консольный таймер. Используй System.Threading.Timer, в хэлпе написано, как ждать выполнения
есть класс(предназначенный для использования в WinForms приложении) который должен раз в секунду читать из потока строчку и выводить на экран, при этом естественно возникает необходимость в создании внутреннего таймера,
при использовании System.Windows.Forms.Timer в GUI приложении все работает как хотелось бы.
теперь понадобилось сделать консольное приложение с использованием этого класса (на самом деле просто пишется тест в NUnits)
но в этом случае FormsTimer не работает, и получается нужно использговатьSystem.Threading.Timer(который в GUI приложении не нужен и к тому же возникает необходимость передать в этот самый класс Instance от AutoResetEvent, т.е. нужно изменить параметры вызов функции, те внести глубокие изменения.
те задача по-всей видимости сводится все-таки к тому как заставить WinForms таймер тикать в консольном приложении....
Измени таймер везде на System.Threading.Timer
в конце теста руками какое-то время крутить очередь сообщений
for (...)
{
Application.DoEvents;
}
глюки с тредами потом кто будет вылавливать?
в конце теста руками какое-то время крутить очередь сообщенийНу вот не стал бы я такие вещи советовать.
для теста это уж точно лучше, чем заменять winforms-таймер на тредный таймер.
кстати в чем ты видишь проблемы?
кстати в чем ты видишь проблемы?Ну думаю в таком конкретном случае проблем может и не возникнуть. А так они бывают, если используешь цикл сообщений либо не по делу, либо для каких-то корыстных целей. Я просто считаю это не очень аккуратной практикой программирования. Но спорить не буду.
DoEvent спасибо это то, что было нужно
это плохо, придется по стеку вызовов тащить AutoResetEvent....
это плохо, придется по стеку вызовов тащить AutoResetEvent....Это не плохо, это правильно. (Т.е. если ты не можешь написать это правильно, то это не значит, что всё плохо.)
Пока я вижу, что это плохо, а вижу я следующее -
есть форма, есть драйвер устройства(читающий из потока раз в секунду сообщение обращение к этому драйверу(а конкретнее к таймеру) проходит через многоуровневый интерфейс, сл-но я должен добавить на каждом уровне прием-передачу от уровня к уровню объекта AutoResetEvent(или передавать ссылку на таймер снизу вверх).. На верхнем уровне(форма, или Main-функция) я к тому же должен хранить этот AutoResetEvent
зачем это делать когда с помощью WinForms таймера удается автоматически "зарегистрировать" таймер глобально....
так что ничего правильного я пока не вижу, если что не так поправь.
так что ничего правильного я пока не вижу, если что не так поправь.Я не понимаю, зачем передавать куда-то AutoResetEvent. Есть класс, который читает строчку раз в секунду. В этом классе есть таймер, который вызывает колбэк.
class Program
{
static void OnTimer(Object stateInfo)
{
Console.WriteLine("OnTimer");
}
static void Main(string[] args)
{
Timer t = new Timer(OnTimer, null, 1000, 1000);
Thread.Sleep(5500);
}
}
спасибо, здорово ничего оказывается не надо передавать... так даже лучше!
Оставить комментарий
Polly_love
подписываемся на событие от таймераpublic void EventFunction(object sender, EventArgs e)
{
//обработка события
}
Main
{
Timer timer = new Timer;
Timer.Interval = 100;
Timer.Enabled = true;
Timer.Tick += new EventHandler(EventFunction);
///
}
Как теперь подождать прихода события от таймера...?