Синхронизация метода и потоков в .NET - PullRequest
3 голосов
/ 22 февраля 2010

У меня есть два потока в моем приложении - основной поток пользовательского интерфейса и другой поток, инициированный обработчиком события wm_WiiMoteChanged (фоновый поток). В основной теме я делаю некоторые видео обработки. У меня есть функция с именем processFrame, показанная ниже. Я использую этот код для измерения времени обработки каждого кадра и, следовательно, частоты кадров в секунду.

Если я закомментирую строку wm.WiiMoteChanged ... (см. Ниже), частота кадров составляет около 15-20 кадров в секунду, и, глядя на видео, это кажется правильным (с небольшим лагом).

Но когда я раскомментирую строку, то есть добавляю обработчик событий (который сам по себе создаст поток), fps поднимается до 40-50, но это определенно неправильно - видео на самом деле более медленное. 1007 *

Может кто-нибудь объяснить мне, почему это происходит? Спасибо.

private void Main_Load(object sender, EventArgs e)
{
    try
    {
        wm.Connect();
        //wm.WiimoteChanged += wm_WiimoteChanged; 

        wm.SetReportType(InputReport.IRAccel, true);
        wm.SetLEDs(false, false, false, true);
    }
    catch (Exception x)
    {
        MessageBox.Show("Exception: " + x.Message);
        this.Close();
    }
}

Дополнительный код:

private void processFrame(object sender, EventArgs e)
{
    DateTime curr = DateTime.Now;
    performOperation();
    TimeSpan currTime = DateTime.Now - curr;
    lblFPS.Text = (1000 / currTime.Milliseconds).ToString() + " fps";
}

EDIT

Интересная находка, только когда эта строка присутствует в wm_WiimoteChanged, это происходит.

ibxOutput.Image = new Image<Bgr, Byte>(_irViewAreaBitmap);

Sidenote: эта строка также является причиной более высокой задержки - обработка, выполняемая перед установкой, действительно быстрая!

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Потому что, добавляя обработчик событий, вы реагируете на эти WiimoteChanged события и запускаете дополнительный код.

Содержит ли обработчик блокировку? Предлагаю вам опубликовать код для wm_WiimoteChanged()

ОБНОВЛЕНИЕ: предлагаем использовать System.Diagnostics.Stopwatch вместо DateTime.Now Вероятно, DateTime.Now не достаточно точен.

0 голосов
/ 22 февраля 2010

Отображается ли на экране ровно один кадр для каждого вызова метода processFrame? Я подозреваю, что рендеринг происходит в другом месте и блокируется кодом в обработчике WiimoteChanged, что дает вашему методу processFrame больше процессорного времени.

Чтобы ваше измерение FPS было точным, вам нужно убедиться, что processFrame вызывается ровно один раз за кадр. Вы, вероятно, должны также измерять время между последующими вызовами, а не измерять продолжительность performOperation, если только processFrame не будет вызван немедленно снова, когда он вернется.

0 голосов
/ 22 февраля 2010

Ладно, я тут толпа, но я не понимаю вычисления кадров в секунду?

Должен ли ваш FPS фактически не быть числом, которое ProcessFrame вызывается за секунду? Если вы измерите это, вы можете получить более точный результат.

Кроме того, для измерения времени лучше использовать StopWatch; он построен для этой цели.

...