线程破解程序死循环

2023-11-06

最近用opencv+mfc做了一个简单的程序(点击button后,打开视频,另一个button关闭视频)。问题来了,读视频的程序是个死循环。怎么解。因此,应该考虑线程的问题了。让视频程序在线程里跑。

何为线程?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令 指针(PC), 寄存器集合和 堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有 就绪阻塞运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指 运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为 多线程

 线程如何实现?

实际上可以这样简单的理解线程,它是CPU的调度单位.而一个线程是对应一个函数.所以别把一个线程想得太复杂,就只是执行个函数而已.只不过执行的时候是并行执行罢了.如果只是简单的几个线程不涉及使用共同的资源,没其他啥关联.就完全跟简单的执行一个函数类似.只是如果多个线程间关系复杂就会涉及到啥同步问题,那样就有很多复杂的细节性问题.

线程与函数

线程函数必须是全局函数,或者是类的静态成员函数,因为非静态成员函数有this指针,而在进程中无法访问此指针。

但是静态成员函数只能访问静态成员,解决此问题途径:

1. 就是在调用静态成员函数时将this指针作为参数传入,通过该指针访问非静态成员。

2. 不将线程函数定义为类的静态成员函数,而是定义为类的友元函数,这样函数线程也可以有类成员函数相同的权限。

开始有摄像头打开函数: 

bool CcamShowDlg::CameraOpen()
{
	
	if (capture.isOpened() == 0)
	{
		AfxMessageBox(_T("摄像头初始化失败"));
		return false;
	}
	while (1)
	{
		Mat frame;
		capture >> frame;
		imshow("VideoShow",frame);
		waitKey(30);
	}

	return false;
}


若直接在clickbutton下添加函数

void CcamShowDlg::OnBnClickedButtonCameraopen()
{
	// TODO:  在此添加控件通知处理程序代码
	CameraOpen();
	
}

点击button后程序进入了CameraOpen()的死循环。

因此创建一个线程函数来调用CameraOpen()。

void CcamShowDlg::OnBnClickedButtonCameraopen()
{
	// TODO:  在此添加控件通知处理程序代码
	CWinThread* pThread;
	pThread = AfxBeginThread(ThreadFunc,NULL);		
}
UINT CcamShowDlg::ThreadFunc(LPVOID lpParam)
{
	CameraOpen();
	return 0;
}

此时的CameraOpen()必须是类的静态成员函数

static bool CameraOpen();

若CameraOpen()不是静态成员函数。此时程序应变为:

UINT CcamShowDlg::ThreadFunc(LPVOID lpParam)
{
	CcamShowDlg *pObj = (CcamShowDlg *)lpParam;
	pObj->CameraOpen();
	return 0;
}

void CcamShowDlg::OnBnClickedButtonCameraopen()
{
	// TODO:  在此添加控件通知处理程序代码
	CWinThread* pThread;
	pThread = AfxBeginThread(ThreadFunc,this);		
}


友元函数

友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。

形式

friend 类型名 友元函数名(形参表);

然后在类体外对友元函数进行定义,定义的格式和普通函数相同,但可以通过对象作为参数直接访问对象的私有成员

说明如下:

1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;

2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;

3)友元函数不能直接访问类的成员,只能访问对象成员,

4)友元函数可以访问对象的私有成员,但普通函数不行;

5)调用友元函数时,在实际参数中需要指出要访问的对象,

6)类与类之间的友元关系不能继承。

7)一个类的成员函数也可以作为另一个类的友元,但必须先定义这个类。

用法参见http://blog.csdn.net/insistgogo/article/details/6608672

 

 


 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程破解程序死循环 的相关文章

随机推荐

  • Kubernetes 基本概念

    Kubernetes 是什么 Kubernetes 是一个可移植 可扩展的开源平台 用于管理容器化的工作负载和服务 可促进声明式配 置和自动化 是谷歌保密了十几年的秘密武器Borg的开源版本 谷歌一直通过Borg系统管理着数量庞大 的应用程
  • 2023华为OD机试备考攻略 以及题库目录分值说明 考点说明

    刷题库 刷题库 刷题库 重要的事情说三遍 要刷有多种语言的实现的题库 一种语言看不懂可以换另一种语言 而且可以结合起来去重 类似下面这种的题库 华为OD机试备考攻略 以及题库目录分值说明 考点说明 blog csdn net banxia
  • copy of an AVPacket structure

    a copy of an AVPacket structure 参考 https stackoverflow com questions 12929330 create a copy of an avpacket structure ok
  • 回调函数的作用详解

    回调函数的作用 原文地址 回调函数的作用 加菲的日志 网易博客 一直不太理解回调函数的作用 下面是找到的一些关于回调函数的作用的解答 1 回调函数是一个很有用 也很重要的概念 当发生某种事件时 系统或其他函数将会自动调用你定义的一段函数 2
  • STM32的DMA输出DAC的正弦波与三角波 幅度与周期可调可调(原创篇);

    废话不多说 因为激光振镜驱动需要正弦波与三角波 为了省事 直接通过STM32F407实现DAC的DMA输出 省CPU资源 经过调试 在0 NkHZ之内都可以实现 目前采样点为500个 上数据吧 其中三角波自动生成500个数据 在初始化的时候
  • 自己的Anaconda管理多个虚拟环境,这样就可以在不同的环境下安装互不干扰的库

    项目场景 Anaconda可以安装多个虚拟解释器 每个解释器可以安装自己独有的库 从而每个解释器之间起到互不干扰的作用 这点Anaconda就非常强大了 查看Anaconda的解释环境 在电脑开始中选择Anaconda Prompt set
  • 搭建一个vue3+ts项目(超祥/必看)

    一 创建vite项目 1 在一个文件夹下通过cmd打开 输入命令 npm create vite latest 2 接着选择ts 3 创建好之后 结构目录如下 二 启动vite项目 1 安装依赖 启动项目前需要先 npm i 从上图可以发现
  • C++智能指针知识总结

    智能指针 智能指针是为了避免内存泄漏的技术 智能指针采用了RAII特性 利用对象生命周期来控制程序资源 在对象构造时获取资源 接着控制对资源的访问使之在对象的生命周期内始终保持有效 最后在对象析构的时候释放资源 借此 我们实际上把管理一份资
  • Python 四五事

    介绍 Python 相关工具 工作流程和测试框架 最后更新 2014 1 19 引言 接续着之前的文章 虽然隔得比较久 本文继续介绍以 Windows 平台为背景的 Python 开发相关的工具 希望能对你有所帮助 另外很多东西本文都是延续
  • html+css+javascript知识点总结

    一 html css 基础 1 1 Html 和 CSS 的关系 学习 web 前端开发基础技术需要掌握 HTML CSS JavaScript 语言 下面我们就来了解下这三门技术都是用来实现什么的 1 HTML 是网页内容的载体 内容就是
  • 14.12 修改职工信息

    14 12 修改职工信息 1 按照编号修改职工信息 先声明 修改职工 void mod Emp 再实现 就是把查到的职工删除 再在那个位置输入一个新职工 所以跟添加职工的代码很多地方一样 修改职工 void WorkerManager mo
  • Koordinator 异构资源/任务调度实践

    前言 Koordinator 是阿里云基于过去我们建设的统一调度系统中积累的技术和实践经验 对外开源了新一代的调度系统 Koordinator 支持 Kubernetes 上多种工作负载的混部调度 它的目标是提高工作负载的运行时效率和可靠性
  • 从入门到放弃系列--如何成为全栈工程师04

    之前的3节课 我告诉了你基础的html div css布局 你应该已经了解网页是怎么制作的 在开从第5节课开始 我会用一个完整的实例 带你制作快速制作一个企业网站 这节课 我要把让你明白 当你在浏览器里输入一个网址 网页是怎么出现的 以及
  • 数据分析与数据挖掘的区别

    数据分析 数据分析是用适当的统计方法对收集的数据进行分析 概括 总结 对数据进行恰当的描述 提取有用的信息 数据挖掘 数据挖掘是从海量的数据中通过算法发现隐藏在数据中的规律和知识的过程 区别 1 数据分析数据量可大可小 数据挖掘需要从海量数
  • 重磅:门头沟赔偿推迟5个月,没有无缘无故的大涨!

    Mt Gox善后受托人向东京地方法院提出寻求延长善后计划提交期限的动议 2019年10月25日 东京地方法院发布一项命令 允许延长期限到2020年3月31日提交善后计划 编译 白夜 编辑 秦晋 碳链价值最新获悉 Mt Gox发布声明表示 由
  • Python3中Pillow(PIL)介绍

    PIL全称为Python Imaging Library 是Python中的免费开源图像处理库 PIL的最新版本为1 1 7 于2009年9月发布 支持Python的最高版本到2 7 原始的PIL开发于2011年停止 随后 一个名为Pill
  • vue前端实现模糊查询然后表格自动定位

    element input自动补全输入框 el table 注 这个table没有做分页 数据又多 所以才在前端添加搜索定位功能 html 自动补全输入框 和 table
  • 浏览器的标准模式、怪异模式

    历史原因 在W3C标准未确定之前 各浏览器对于HTML和CSS有各自不同的解析方式 很多旧网页都是在W3C标准未确定时期实现 设计的 在W3C标准确定之后 浏览器为了保证对非标准的旧网页设计的后向兼容性 现代浏览器 IE6以上 IE6以下版
  • ORACLE UNION和UNION ALL操作符

    UNION用于合并两个及以上查询结果 SELECT COLUMN1 FROM TABLE1 UNION ALL SELECT COLUMN2 FROM TABLE2 其中COLUMN1和COLUMN2的数量 顺序相同 数据类型要相似 UNI
  • 线程破解程序死循环

    最近用opencv mfc做了一个简单的程序 点击button后 打开视频 另一个button关闭视频 问题来了 读视频的程序是个死循环 怎么解 因此 应该考虑线程的问题了 让视频程序在线程里跑 何为线程 线程 有时被称为轻量级进程 Lig