0

嗨,我只是想了解如何实现一个需要大约 80 到 120 毫秒(大部分是 80 毫秒)来执行的循环。循环必须执行大约 30 分钟......基本上它是一个 SURF 匹配算法。

目前我正在使用 aSystem.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);
   }
}
4

1 回答 1

0

与其让计时器滴答声执行工作,不如让计时器滴答声将作业排队并让其他东西(可能是线程池中的线程)消耗这些作业。您可以使用信号量来限制同时运行的作业数量,并且可以检查队列的状态以避免这种过度提交问题。

于 2012-08-13T11:14:49.820 回答