2014-09-03 65 views
0

我有一个任务与大量的输入数据(视频)。我需要在后台处理它的帧而不冻结UI,而且我不需要处理每一帧。一次只有一个线程#

所以我想创建一个后台线程,并在背景忙时跳过帧。比我从视频输入和再次获得另一帧。

我现在有这个简单的代码。我工作了。但它能引起麻烦,可能有更好的方法吗?

public class VideoProcessor{ 

bool busy=false; 

void VideoStreamingEvent(Frame data){ 
    if(!busy){ 
    busy=true; 
    InvokeInBackground(()=>{ 
    DataProcessing(data); 
    busy=false; 
    }); 
    } 
} 

} 
+0

因为它不会工作(以可靠的方式)。 'busy'标志必须是'volatile'。这就是说...如果它适用于这种(简单的)本地化任务IMO,则不需要使事情变得更加复杂。 – 2014-09-03 12:24:07

+0

从问题中不清楚你想要什么。你只想在一个线程中执行'VideoStreamingEvent'?如果是这样,当另一个线程同时尝试执行它时,你会发生什么? – 2014-09-03 12:30:44

回答

1

但它引起的麻烦,并且可以有一个更好的方法吗?

如果VideoStreamingEvent方法不会应用在多个线程同时执行,那么这将正常工作,如果你简单地添加volatilebusy字段声明。在实践中,可能会出现,如果没有它,它可以正常工作,但这种行为不能保证。

如果有可能在多个线程上调用VideoStreamingEvent,那么您需要在读取和写入busy字段的位置进行一些同步。

+0

“你只需添加易变的” 谢谢,它解决了我担心的那个问题。 VideoStreaming仅在IO线程中发生,因此无法一次执行两次。 – 2014-09-03 12:34:39