Pausar a câmera do Kinect - Possível erro no SDK que regista o manipulador de eventos

9

Estou no processo de converter meu código Beta do Microsoft SDK para o Lançamento oficial do Microsoft SDK que foi lançado em fevereiro de 2012.

Eu adicionei um PauseKinect() genérico para pausar o Kinect. Minha pausa realmente removerá apenas o manipulador de eventos que atualizou a imagem

Prós:

  • Sem reinicialização (mais de 30 segundos de tempo de espera)

Contras:

  • Kinect ainda processando imagens

Método de pausa (somente cor)

internal void PauseColorImage(bool isPaused)
{
    if (isPaused)
    {
        _Kinect.ColorFrameReady -= ColorFrameReadyEventHandler;
        //_Kinect.ColorStream.Disable();
    }

    else
    {
        _Kinect.ColorFrameReady += ColorFrameReadyEventHandler;
        //_Kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
    }
}

PROBLEMA:

Embora eu esteja removendo o evento, por que ele ainda está sendo acionado?

NOTA:

Além disso, quando faço uma pausa na imagem colorida, também estou pausando a profundidade e o esqueleto em seu objeto.

NOTA LATERAL:

Se eu descomentar meu código, tudo funciona bem, mas depois levará uma eternidade para reinicializar o que não é o que eu quero fazer.

MS no Reflector

public void AddHandler(EventHandler<T> originalHandler)
{
    if (originalHandler != null)
    {
        this._actualHandlers.Add(new ContextHandlerPair<T, T>(originalHandler, SynchronizationContext.Current));
    }
}

public void RemoveHandler(EventHandler<T> originalHandler)
{
    SynchronizationContext current = SynchronizationContext.Current;
    ContextHandlerPair<T, T> item = null;
    foreach (ContextHandlerPair<T, T> pair2 in this._actualHandlers)
    {
        EventHandler<T> handler = pair2.Handler;
        SynchronizationContext context = pair2.Context;
        if ((current == context) && (handler == originalHandler))
        {
            item = pair2;
            break;
        }
    }
    if (item != null)
    {
        this._actualHandlers.Remove(item);
    }
}


public void Invoke(object sender, T e)
{
    if (this.HasHandlers)
    {
        ContextHandlerPair<T, T>[] array = new ContextHandlerPair<T, T>[this._actualHandlers.Count];
        this._actualHandlers.CopyTo(array);
        foreach (ContextHandlerPair<T, T> pair in array)
        {
            EventHandler<T> handler = pair.Handler;
            SynchronizationContext context = pair.Context;
            if (context == null)
            {
                handler(sender, e);
            }
            else if (this._method == ContextSynchronizationMethod<T>.Post)
            {
                context.Post(new SendOrPostCallback(this.SendOrPostDelegate), new ContextEventHandlerArgsWrapper<T, T>(handler, sender, e));
            }
            else if (this._method == ContextSynchronizationMethod<T>.Send)
            {
               context.Send(new SendOrPostCallback(this.SendOrPostDelegate), new ContextEventHandlerArgsWrapper<T, T>(handler, sender, e));
            }
        }
    }
}
    
por MyKuLLSKI 24.02.2012 в 05:45
fonte

1 resposta

5

Depois de postar uma pergunta idêntica no fórum da Microsoft e conversar com vários representantes da Microsoft, eles basicamente disseram que a única maneira de fazer uma "pausa" é ativar / desativar os streams (descomente meus comentários). Sem dizer diretamente para a frente é um bug no SDK. Eles vão conversar com as pessoas da equipe de desenvolvimento e tentar corrigir o problema em versões futuras.

EDITAR

Na versão de maio de 2012, ainda não está corrigido. Obrigado Microsoft!

    
por MyKuLLSKI 29.02.2012 / 16:41
fonte