0

実行に約 80 ~ 120 ミリ秒 (ほとんどの場合 80 ミリ秒) かかるループを実装する方法を知りたかっただけです。ループは約 30 分間実行する必要があります... 基本的には SURF マッチング アルゴリズムです。

現在、 を使用しSystem.Threading.Timerて 90ms ごとに実行されるタイマーを作成していますが、問題は、計算時間が可変であるため、しばらくするとスタックがオーバーフローしてプログラムが終了することです。

GUIを作成するためにWPFを使用しています。

スレッド化を使用してこのようなループを実装するより良い方法はありますか? どんな助けでも大歓迎です!前もって感謝します。

//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 に答える