限制线程如何同时运行计数

时间:2019-05-25 02:17:35

标签: c#

我用opencvsharp从USB摄像机捕获图像。但是出于功耗原因,它只能同时工作两个。我有五个摄像机。所以我只能限制线程数。

static void CameraThread(object index)
{
    var frame = new Mat();
    var capture = new VideoCapture();
    capture.Open((int)index);
    while (true)
    {
        capture.Read(frame);
        var bm = frame.ToBitmap();
        //save bitmap here......
    }
}
static void Main(string[] args)
{
    for (var i = 0; i < 5; ++i)
    {
        var trd = new Thread(() => CameraThread(i));
        trd.Start();
    }
}

上面的代码无法正常工作,因为五个线程同时运行。我将for(var i = 0; i <5; ++ i)修改为for(var i = 0; i <2; ++ i )。现在效果很好。我在Google上和一些人说:usb功耗原因不能支持五个摄像头同时捕获。所以我的意思是固定工作线程如何同时计数(这种情况下只有2个)。当我创建5个时

2 个答案:

答案 0 :(得分:0)

您可以使用信号量来限制活动摄像机的数量(请参见https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore?view=netframework-4.8#examples),也可以创建具有2个工作线程的队列。还有一个阻塞集合可以达到类似的效果。您还可以将文件保存移到其他线程,这样就不必在开始阅读下一台摄像机之前就等待文件保存

答案 1 :(得分:0)

您可以看看interlocked类。每当线程执行工作时,您就可以 from_exp salary_range count 5 10to12 2 5 15to20 1 5 7to8 1 变量。完成后,您可以df.groupby(['from_exp','salary_range']).filter( lambda x : x['from_exp'] == '5' )['salary'].size() 。 因此,如果要创建线程,只需先验证变量是否小于所需的线程限制即可。