2012-08-13 215 views
0

Hy,我只是想了解如何實現一個需要大約80到120ms(大部分80ms)才能執行的循環。循環必須執行大約30分鐘......基本上它是SURF匹配算法。Threading.Timer堆棧溢出

目前我正在使用System.Threading.Timer創建一個計時器,每90毫秒後執行一次,但問題是由於計算時間是可變的,所以一段時間後堆棧溢出並且程序關閉。

我正在使用WPF來創建GUI。

有沒有更好的方法來實現這樣一個循環使用線程?任何幫助將非常感激!提前致謝。

//initialization 
private System.Threading.Timer Visual_AR1; 
Visual_AR1 = new System.Threading.Timer(new TimerCallback(Video_AR1), null, 0, 90); 
private void Video_AR1(object state) 
{ 
    lock (this) 
    { 
     // SURF matching 
     modelImage_AR1 = new Image<Gray, byte>(droneControl_AR1.BitmapImage).Resize(1.8, INTER.CV_INTER_NN); 
     map_image_d1 = DrawMatches_gpu.GPU_0(wayx, modelImage_AR1, observedImage, pgpuObservedKeyPoints_imp, pgpuObservedDescriptors_imp, out matchTime_0, out pX1, out pY1); 
     Dispatcher.BeginInvoke((Action)delegate() 
     { 
      label4.Content = "Time Taken by GPU_0 : " + matchTime_0.ToString(); 
     }); 
     mask_selector_d1(); 
    } 
} 

這是一個可行的解決方案?

private Thread threadTask = null; 
private void threadTask_Start() 
{ 
    if (threadTask == null) { 
     threadTask = new Thread(SURF); 
     threadTask.Start(); 
    } 
} 

private void SURF() 
{ 
    while(true) 
    { 
lock (this) 
     { 
      // SURF matching 
      modelImage_AR1 = new Image<Gray, byte>(droneControl_AR1.BitmapImage).Resize(1.8, INTER.CV_INTER_NN); 
      map_image_d1 = DrawMatches_gpu.GPU_0(wayx, modelImage_AR1, observedImage, pgpuObservedKeyPoints_imp, pgpuObservedDescriptors_imp, out matchTime_0, out pX1, out pY1); 
      Dispatcher.BeginInvoke((Action)delegate() 
      { 
       label4.Content = "Time Taken by GPU_0 : " + matchTime_0.ToString(); 
      }); 
      mask_selector_d1(); 
     } 
thread.sleep(40); 
    } 
} 
+1

顯示代碼請 – 2012-08-13 09:02:47

+0

那麼,如果循環需要80-120ms,爲什麼要打擾定時器?發出一個獲得開始時間的任務,然後循環,匹配,檢查每次比賽結束後的時間,看看30分鐘是否已經過去? – 2012-08-13 09:10:59

+0

@ArsenMkrt我已添加代碼..看看 – 2012-08-13 09:26:21

回答

0

不是使計時器滴答執行工作,使計時器滴答排隊工作,並有其他的東西(從線程池中大概線程)消耗的作業。您可以使用信號量來限制同時運行的作業數量,並且可以檢查隊列的狀態以避免此類過度提交問題。