#include <opencv2/core/version.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/opencv.hpp> using namespace System::Runtime::InteropServices;
using namespace System::IO;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Drawing::Imaging;
using namespace System::Runtime::Serialization::Formatters::Binary;
using namespace System::Windows::Forms;
using namespace System::Threading; using namespace FRS;
using namespace FRS::Util;
using namespace DataAngine; HANDLE hMutex = CreateMutex(NULL,FALSE,NULL); cv::VideoCapture *cap;
void Show(){
while (true){
cv::Mat frame;
WaitForSingleObject(hMutex, INFINITE);
cap>>frame;
ReleaseMutex(hMutex);
imshow("video", frame);
cv::waitKey( / cap->get(CV_CAP_PROP_FPS));
}
}
int main()
{
FeatureData ^fa = gcnew FeatureData(); //cap.open(0);
cap = new cv::VideoCapture();
cap->open("rtsp://admin:admin12345@172.18.132.234:554"); if (!cap->isOpened())
{
std::cout << "open rtsp error" << std::endl;
return ;
}
Thread ^showThread = gcnew Thread(gcnew ThreadStart(Show));
showThread->Start(); bool stop = true;
while (stop)
{
cv::Mat frame;
WaitForSingleObject(hMutex, INFINITE);
cap>>frame;
ReleaseMutex(hMutex);
if (frame.empty()) continue;
System::GC::Collect(); Thread::Sleep();
}
}

本代码为人脸识别视频处理代码,包含两个线程,其中Show线程为opencv读取rtsp流,主线程代码自填。其中GC::Collect()为程序垃圾回收。

代码本为单线程,书写中发现VideoCapture读取视频流时存在缓存,并有缓存上限,单纯进行主线程视频处理时会因为处理时间较长发生缓存溢出问题,所以增设多线程Show()读取消耗VideoCapture缓存。

增设Show()线程时发现存在两线程同时读取缓存现象,添加互斥锁hMutex ,代码中包含互斥锁的句柄初始化以及加锁解锁代码。

C++ windows 多线程 互斥锁的更多相关文章

  1. java基础-多线程互斥锁

    多线程(JDK1.5的新特性互斥锁)* 1.同步 * 使用ReentrantLock类的lock()和unlock()方法进行同步* 2.通信 * 使用ReentrantLock类的newCondit ...

  2. python 并发编程 多线程 互斥锁

    互斥锁 并行变成串行,牺牲效率 保证数据安全,实现局部串行 保护不同的数据,应该加不同的锁 现在一个进程 可以有多个线程 所有线程都共享进程的地址空间 实现数据共享 共享带来问题就会出现竞争 竞争就会 ...

  3. Python多线程互斥锁

    import threading import time num=0 def Mylock(lock): global num lock.acquire() num=num+1 time.sleep( ...

  4. 笔记1 linux 多线程 互斥锁

    //mutex lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test ...

  5. win32进阶必备:多线程同步之互斥锁

    应用多线程互斥锁之前首先简单过一下C程序可能用到的3个创建线程函数: CreateThread,windows系统提供的唯一创建线程API,_beginthread和_beginthreadex都在内 ...

  6. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  7. 【多线程】C++ 互斥锁(mutex)的简单原理分析

    多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,分为两种类型的多任务处理:基于进程和基于线程. 1)基于进程的多任务处理是程序的并发执行. 2)基于线程 ...

  8. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  9. linux多线程编程之互斥锁

    多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #in ...

随机推荐

  1. 使用excel进行数据挖掘(5)---- 应用场景分析

    使用excel进行数据挖掘(5)---- 应用场景分析 在配置环境后,能够使用excel进行数据挖掘. 环境配置问题可參阅: http://blog.csdn.net/xinxing__8185/ar ...

  2. Logical Volume Manager (Linux)

    http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) Logical Volume Manager (Linux) From Wiki ...

  3. AngularJs 在控制器中过滤

    <html> <head> <title>Simple app</title> <script src="https://ajax.go ...

  4. ORACLE SQL性能优化(全)

    ORACLE SQL性能优化(全) http://wenku.baidu.com/view/b2aaba3887c24028915fc337.html

  5. 在XP上安装VS2002

    在2002 年,随着 .NET 口号的提出与 Windows XP/Office XP 的公布,微软公布了 Visual Studio .NET(内部版本为 7.0). 使用VS2002+Object ...

  6. IOS8 TouchID使用介绍

    本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35555123 IOS8将指纹识别技术开放出来了.我们能够利用用户设置的touch I ...

  7. pdf文件的作成

    Dim Report As New crProgressList Report.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.P ...

  8. ZOJ - 3948 Marjar Cola 【循环】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3948 题意 用 x 个 瓶身 可以 换 一瓶饮料 用 y 个 瓶 ...

  9. [noip2014day2-T1]无线网路发射器选址

    随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平行街道之间 ...

  10. margin在块元素、内联元素中的区别 padding

    (1)margin在块元素.内联元素中的区别 HTML(这里说的是html标准,而不是xhtml)里分两种基本元素,即block和inline.顾名思义,block元素就是以”块”表现的元素(bloc ...