Hy,我只想了解如何实现一个大约需要80到120ms(大部分为80ms)才能执行的循环。循环必须执行大约30分钟...基本上它是一个SURF匹配算法。
目前我正在使用System.Threading.Timer
来创建一个在每90ms后执行的计时器,但问题是因为计算时间是可变的,所以在一段时间后堆栈溢出并且程序关闭。
我使用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);
}
}
答案 0 :(得分:0)
不要让计时器勾选执行工作,而是让计时器勾选一个工作并让其他东西(可能是来自线程池的线程)消耗这些工作。您可以使用信号量来限制同时运行的作业数,并且可以检查队列的状态以避免这种过度提交问题。