Мышь двигаться и нить - PullRequest
       3

Мышь двигаться и нить

0 голосов
/ 01 января 2011

Когда я перемещаю мышь над окном, программа запускается намного быстрее (3 раза в куб). Это веб-камера .Net / Mono, работающая в режиме реального времени на MacBook. На винде работает отлично. Это может быть функция энергосбережения ноутбука? Код:

Thread t = new Thread(Foo);
t.Priority = ThreadPriority.Highest; // I've tried without priority too, doesn't matter
t.Start();
...
delegate void SetInt(int k);
void Foo()
{
    int k = 0;
    while (true)
    {
        ++k; 
        BeginInvoke(new SetInt(Bar), k);   
    }
}
void Bar(int k)
{
    Graphics.FromImage(pictureBox1.Image).DrawString(k.ToString(),
        System.Fonts.DefaultFont, Brushes.Red, 0, 0);
    pictureBox1.Invalidate();
}

Смотрю значение к. Он увеличивается в 10-30 раз в секунду, в зависимости от движения мыши. Похоже, поток пользовательского интерфейса блокирует рабочий поток? Рабочий поток должен увеличиваться k миллионов раз в секунду.

Редактировать: Мигель де Иказа подозревает, что это ошибка в Mono. Я загрузил его в багтрекер Моно: https://bugzilla.novell.com/show_bug.cgi?id=663433 Контрольный пример прилагается. Сейчас я ищу взлом, чтобы избежать проблемы.

Ответы [ 3 ]

2 голосов
/ 01 января 2011

Разные ОС по-разному относятся к приоритету потоков, и вы не можете полагаться на то, что они работают одинаково на разных ОС.Вы даже не можете полагаться на то, что они работают одинаково на разных виртуальных машинах (Mono vs .net), потому что это значения, зависящие от ОС, которые не определены в спецификации.

1 голос
/ 25 мая 2012

Я изучил это и считаю, что нашел обходной путь.У меня была такая же проблема с программой на C # .Net, работающей в Mono, где сообщения не обрабатывались в потоке.Кажется, проблема в том, что поток не вызывается или не ожидает события.Обход, который я нашел, выглядит следующим образом.

1) Создайте событие формы (обратите внимание, что оно отличается от System.Timers)

private System.Windows.Forms.Timer timerForMonoResponsiveness;

2) Настройкасобытие формы в конструкторе или инициализации

// This is a fix for mono not updating messages until an event (such as movement of
// the mouse) happens
// We use an event timer to fire off an event on a regular basis.
// This calls a function that doesn't do anything.
if (Type.GetType("Mono.Runtime") != null) // Only run if in Mono
{
    this.timerForMonoResponsiveness = new System.Windows.Forms.Timer(this.components);
    this.timerForMonoResponsiveness.Interval = 100;
    this.timerForMonoResponsiveness.Tick += new EventHandler(timertimerForMonoResponsiveness_Tick);
    this.timerForMonoResponsiveness.Start();
}

ПРИМЕЧАНИЕ: « this.components » определено в Form.designer.cs формы (должно быть сделано автоматически) Мой выглядит следующим образом:

private System.ComponentModel.IContainer components = null;

Инициализируется как:

this.components = new System.ComponentModel.Container();

3) Создайте функцию тика для таймера

// This function executes a Tick event so the UI updates on Mono
// This is a Mono bug workaround as the message processing was not being processed
// and was waiting on invoke which on Mono only runs when a UI element is changed (or  
// the mouse is moved). This function therefore runs regularly to mitigate this issue 
// it is called within a Mono check and will not run on Windows
// The function is SUPPOSED TO DO NOTHING.

private void timerForMonoResponsiveness_Tick(object sender, EventArgs e)
{
    this.timerMonoEventForMessagesToBeUpdated.Stop();
    // This doesn't need to do anything, just call the event
    this.timerMonoEventForMessagesToBeUpdated.Start();          
}

Надеюсь, это поможет.

0 голосов
/ 01 января 2011

Учитывая, что вы запускаете это на Mono на Mac, я думаю, что CLR не получает полный приоритет, или поток не получает полный приоритет. Здесь я согласен с мистером, ваше заявление о приоритете может не дать желаемого эффекта.

Также Windows 7, похоже, оптимизирует процессы переднего плана, чтобы придать им более высокий приоритет, поэтому пользовательский интерфейс кажется более отзывчивым, и Mac OS может делать это слишком много. Поэтому, когда в вашем приложении происходит активность (движения мыши и, возможно, нажатия клавиш), вашему приложению дается больше процессорного времени.

Может быть, Mono не обрабатывает приоритет или кто-то меняет ваш приоритет во время выполнения (сама ОС).

...