2011-10-04 92 views
1

我的應用程序有一些問題。繼承人我有網絡攝像頭的圖片餵食功能,這將計算是否有任何動作和地點。但問題是(我的觀點),來自相機的新幀引發的事件頻繁發生,代碼沒有時間完成。所以,我在哪裏可以把一些信號燈或東西,如果這是我的代碼:(我試過很多東西沒有succsessful):C#事件問題

private void button1_Click(object sender, EventArgs e) 
    { 
     FinalVideoSource = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString); 

     FinalVideoSource.NewFrame += new NewFrameEventHandler(FinalVideoSource_NewFrame); 

     FinalVideoSource.Start(); 

     ImageEfects.drawGrid(detectionImage, 40); 
    } 

    public void FinalVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
      image = (Bitmap)eventArgs.Frame.Clone(); 
      #region demoInit 
      if (initalization) 
      { 
       image1 = image; 
       initalization = false; 
      } 
      #endregion demoInit 

      ImageProcessing.calculateDiferences(ref image, ref image1, ref detectionImage); 

      screen1.Image = image; 
      screen2.Image = detectionImage; 
    } 
+0

也許是改寫標題?這是非常通用的。 –

+0

實際問題是什麼?你能提供引發事件的代碼嗎?如果不是,你知道每個事件是否來自同一個線程嗎? – Stephan

回答

0

只是不要每一幀畫面進行比較。我會存儲一個幀,而不是等待(計數)指定數量的幀,並比較當前幀和存儲幀(在單獨的線程中)。並存儲當前幀以供下一次比較。

要等待的幀數由您決定,取決於您忽略移動的時間圈數。

+0

是的,但是如果在每個新相機框架上發生事件,我怎麼能防止這種情況發生。多數民衆贊成我的問題,Cuz如果事件accour當前代碼將停止執​​行,它會跳轉到事件處理程序權利? – gorgi93

+0

這個事件被解僱了,但是如果你什麼都不做,只會增加一個沒什麼大不了的計數器。我想說的是:只有在第n次事件被觸發時才執行你的代碼。但是你應該在一個單獨的線程中這樣做,否則你可能會建立一系列事件。 –

+0

除此之外,我想知道傳統的事件處理在這裏是否合適。也許你應該看看[反應擴展](http://msdn.microsoft.com/en-us/data/gg577609)。 –

0

我會使用在FinalVideoSource_NewFrame的開頭設置的標誌,如果設置了該標誌,將使該函數返回。在FinalVideoSource_NewFrame的開頭和末尾切換此標誌。這樣,如果計算週期需要更長時間,您將永遠不會出現在隊列中。