2013-10-23 81 views
5

我遇到了一些事件的麻煩。問題是,有時候這個事件不會引發。C#事件沒有引發和線程

我們已經從我們在軟件中實施的公司獲得了一個相機。在軟件中,我們註冊了一個事件,每次在相機上拍攝圖像時都會觸發該事件。

我注意到,隨着處理能力需求的增加(例如,計算圖像的平均平均值和處理更大的圖像)有時會導致事件不會上升。此外,我可以通過增加相機的幀速率來更經常地實現這一點。我知道一個框架丟失了,因爲它們標有ID。

在他們自己的演示軟件中,我能夠以相同的速度運行而沒有任何問題。他們的軟件不執行任何計算或任何事情,它只是接收並顯示圖像。

我很困惑,因爲這是我有相機的最接近的連接;我所能做的就是等待事件上升。我想問問你是否知道任何事件會被忽略的情況。

對我來說,它看起來像相機正在發射的圖像,但由於某種原因,甚至沒有拿起(超載?)。

下面是一些相關的代碼:

​​

正如你可以看到我拿的框架,將其添加到隊列,然後告訴我外面的類有什麼東西讓他們去取。我儘可能快地發佈事件線程。

摘要:

我的事件,有時不提高。我認爲這是因爲主線太辛苦了。

你有沒有經歷過有時沒有被提出的事件?

+6

這聽起來像是你正在使用的第三方庫問題,而不是你的代碼。但是,如果你可以顯示一些代碼將是一個開始... – James

+0

我雖然如此,直到我開始他們的演示程序,它工作正常。我已經包含了一些代碼 – Tallkotten

回答

13

可能性是事件處理程序在觸發事件的代碼能夠觸發更多事件之前都需要完成;它可能只有一個線程來觸發事件。在當前事件結束之前它有一個新事件觸發時,它可以跳過觸發該事件(這看起來是這樣做的)還是排隊等待以後。如果它對後者有影響,那麼如果事件處理程序幾乎總是花費比事件啓動之間的時間更長的時間,那麼它會冒着遠遠落後的風險。落後意味着消耗的內存數量不斷增加,以及事件被一些時間以前發生的事件觸發,這在某些情況下可能會成爲問題。

你可以通過事件處理程序來解決這個問題,但事實上並不是這樣做的,而是將信息放入一個隊列中(這裏BlockingCollection會很好),這樣另一個線程(或者線程,如果你的處理可以安全地並行完成)可以處理項目。但要小心,除非偶爾花費「太長時間」來處理事件,否則最終只會產生一個正在增長和增長的隊列,或者只是使用比所能處理的線程更多的線程溢出您的機器。如果你只是偶爾需要「太長時間」,那麼這將有助於在沒有積壓的情況下實現它。最後,如果你的處理時間太長,你可能別無選擇,只能專注於提高事件處理程序的性能,以至於平均花費的時間少於幀速率,或者只是限制您的處理可以處理的幀頻。

+0

對不起,我應該包含一些代碼。正如你在我編輯的問題中看到的那樣,我會盡快釋放線程。 – Tallkotten

+0

你似乎仍然是正確的。在每次錯過幀之前,函數需要在0.2-0.3秒之間完成,而不是正常的0.032-0.003秒。我猜它必須做一個我從未包含在編輯代碼「Camera.QueueFrame(frame);」的部分我在哪裏再次將接收到的幀添加到攝像機隊列中。我將不得不檢查確定。 – Tallkotten

+0

已解決。你是對的。 – Tallkotten