XNA Video Player对象导致'Cross Thread MessagingException'

时间:2011-05-03 20:03:01

标签: c# multithreading exception xna

(关于我之前的一个问题:Playing a Video (MSDN Tutorial)

我有以下问题:当我尝试读取XNA VideoPlayer对象的状态时,我得到CrossThreadMessagingException。意思是,我试图从另一个线程中读取。这似乎是不允许的(我不知道线程如何在C#内部工作:-)

有关如何解决此问题的任何想法? (有没有办法告诉VideoPlayer对象写入缓冲区或什么?)

代码:

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    if (player.State == MediaState.Stopped)  //Causes the exception
    {
        player.IsLooped = true;
        player.Play(video); //Causes the "mysterious" crash
    }

    // ...
}

错误讯息:

  

player.State = 'player.State' threw an
  exception of type
  'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException'

4 个答案:

答案 0 :(得分:1)

是的,显然不仅仅是因为他有问题,因为我有完全相同的问题,在我的电脑上工作正常,移植到360和“BANG”“CRASH”“BOOM”。我正在其他论坛上工作,并在寻找答案时找到了这个。

杰森

Sylven游戏开发

答案 1 :(得分:0)

这很奇怪,因为Update方法在主线程上。它告诉我视频播放器已加载,或正在另一个线程上更新...你能否更新问题,详细说明你如何加载/初始化视频播放器?

答案 2 :(得分:0)

尝试将播放器设置为=新的VideoPlayer();进入更新方法(检查您是否已经创建过它)。

如果未在调试器中运行,是否会发生此错误?

此外,您的代码在开始尝试播放之前未检查视频内容的加载是否已完成 - 尝试在视频播放开始时延迟,并查看是否可以减少问题。

答案 3 :(得分:0)

我遇到过这个问题,可以肯定地说你在调试时看到了这个错误(单步执行代码)。这实际上是预期的行为,因为调试器本身试图从不同的线程访问(遗憾的是我无法找到支持此内容的源代码),但您的实际代码将能够正常访问该属性。 / p>

实际错误很可能是其他错误,例如无效的电影文件(请参阅此处了解视频要求:http://msdn.microsoft.com/en-us/library/dd254869.aspx)。