2012-07-04 10 views
0

фон:Приложения останавливая при использовании MethodInvoker в пользовательском таймере

Мне нужна высокий таймер разрешения для встроенного системного решения, поэтому я решил использовать MicroTimer из The Code Project ...

Кстати, я «Для этого была разработана приложение Windows Forms, чтобы проверить его эффективность в таких приложениях и избежать « перекрестная работа ... ». Мне нужно использовать методы вызова, BackgroundWorker и т. д. и решите использовать этот код:

private void btnMicorTimer_Click(object sender, EventArgs e) 
{ 
    // Instantiate new MicroTimer 
    MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer(); 
    // Add event handler 
    microTimer.MicroTimerElapsed += 
     new MicroLibrary.MicroTimer.MicroTimerElapsedEventHandler(OnTimedEvent); 

    // Call micro timer every 1000µs (1ms) 
    microTimer.Interval = 1000; 

    // Can choose to ignore event if late by Xµs (by default will try to catch up) 
    // microTimer.IgnoreEventIfLateBy = 500; 

    microTimer.Enabled = true; // Start timer 

    // Do something whilst events are happening. For demo sleep, 2000 ms (2 sec). 
    System.Threading.Thread.Sleep(2000); 

    microTimer.Enabled = false; // Stop timer 
} 

private void OnTimedEvent(object sender, 
          MicroLibrary.MicroTimerEventArgs timerEventArgs) 
{ 
    string response = string.Format(
        "Count = {0:#,0} Timer = {1:#,0} µs | " + 
        "LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs", 
        timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds, 
        timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime); 

    // Do something small that takes significantly less time than Interval 
    if (listBox1.InvokeRequired) 
    { 
     Invoke(new MethodInvoker(
      delegate 
      { 
       listBox1.Items.Add(response); 
      })); 
    } 
    else 
     listBox1.Items.Add(response); 
} 

Проблема:

Как было сказано ранее, применение немедленно остановить после того, как кнопка нажата! Кратко это то, что происходит после того, как btnMicorTimer_Click :(Это выглядеть проект в ловушке в бесконечном цикле

+0

Что вы имеете в виду, останавливая вы сделали добавить сон в потоке пользовательского интерфейса ... –

+0

Я желательно это: HTTP: //postimage.org/image/f0lnt11bp/ Но правила сайта не позволяют мне добавить эту фотографию в мой пост! BTW: Приложение дает огромные ресурсы и не отвечает ... –

ответ

0

Пик вы видите можно легко объяснить:.

Вы запрашиваете обновление UI каждую миллисекунду путем добавления элемента ..? к ListBox

это замедлит реакцию значительно UI

+0

Tanx Erno, но то, что вызвало удивление для меня, не было PEAK в UI (как я предвижу для него): Для меня неприемлемо: почему приложение не отвечает! задержка не имеет значения. Я вынужден каждый раз (даже с 100 мс работы MicroTimer) заканчивать приложение задачи, чтобы вернуться в нормальное состояние ... –

+0

Он не отвечает, потому что вы спамеруете поток пользовательского интерфейса сообщениями. Он слишком занят, чтобы реагировать на действия пользователя. (Я не понимаю последнюю строчку вашего комментария) –

+0

Спасибо за ваше время, я имею в виду: когда мой спам закончится, пользователь должен отреагировать нормально! Разве это не правда? –

 Смежные вопросы

  • Нет связанных вопросов^_^