XNA VideoPlayer对象导致'CrossThreadMessagingException'
本文关键字:CrossThreadMessagingException VideoPlayer 对象 XNA | 更新日期: 2023-09-27 17:54:23
(关于我之前的一个问题:播放视频(MSDN教程))
我有以下问题:当我试图读取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'
显然不只是他有问题,因为我有完全相同的问题,在我的电脑上运行良好,移植到360和"砰"崩溃"BOOM"。我正在其他论坛上工作,在寻找答案时发现了这个。
杰森Sylven Game Development
这很奇怪,因为Update方法在主线程上。这表明视频播放器已经加载,或者正在另一个线程上更新…你能更新问题的细节,你是如何加载/初始化视频播放器?
尝试将player = new VideoPlayer();在更新方法(检查你还没有创建它等)。
当不在调试器中运行时是否发生此错误?
此外,你的代码没有检查视频内容的加载是否已经完成之前,你开始尝试播放它-尝试延迟当视频播放开始,看看这是否减少了问题。
我遇到过这个问题,可以肯定地说,您在调试(逐步执行代码)时看到了这个错误。这实际上是预期的行为,因为调试器本身正试图从不同的线程访问(不幸的是,我找不到我读到的支持这一点的源代码),但您的实际代码将能够访问该属性。
实际的错误很可能是其他的东西,比如无效的电影文件(查看这里的视频需求:http://msdn.microsoft.com/en-us/library/dd254869.aspx)。