2014-09-03 141 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