MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

2023-11-16

MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

本文简单阐述了如何使用一个afxbeginthread创建一个线程(两种方法,使用默认设置,使用自主设置参数),以及一些如同,挂起,释放。边界锁等操作。

①.h文件添加声明

public:
CWinThread *m_pthread;
CWinThread *m_pthread2; 
static UINT __cdecl  hellothread(LPVOID lparam);
 //4.掐指算了一下。说是>vs 2005的编译器定义线程函数都需要添加两个宏,即UINT _cdecl
static UINT __cdecl testthread(LPVOID lparam);
CCriticalSection g_criticalsection; //边界锁,线程间同步用的。

//20190319 updata    如果创建了两个线程最好使用两个线程开关。一个开关,好像无法控制两个线程。
BOOL tflag;  //用作线程开关。

//1.线程同步有四种方式,边界锁、互斥量(CMutex)、信号灯、CEvent(事件)。不过对于CEvent和边界锁感觉能理解。
//http://blog.csdn.net/i_likechard/article/details/77531457    这个是介绍Cevent在线程中的用法的。
//2.边界锁CCriticalSection 和互斥量Cmutex很像,唯一的差别是,CMutex能够在进程间使用。
//3.网上也有通过UINT hellothread(LPVOID lparam);这种方式直接定义的;不过运行的时候会报错。

②.cpp 文件添加初始化及定义 

//特别注意,线程函数定义的代码位置一定要位于使用afxbeginthread()之前

在CthreadDlg::CpratiseDlg(CWnd*pParent):CDialogEx(CpratiseDlg::IDD,pParent)函数中,添加如下代码:将线程开关置为真。我的工程名为thread。

tflag=true;

以下为线程函数定义:

UINT __cdecl CthreadDlg::hellothread(LPVOID lparam) //线程1函数定义
{
    //CthreadDlg *threadol = new CthreadDlg; 
    //CthreadDlg *threadol=new CthreadDlg(); 
    CthreadDlg *threadol=(CthreadDlg*) lparam;  
    //以上3句代码均可实现将this指针传递给threadol对象。通过 "threadol->" 的方式,使得线程1中可以调用主线程的所有函数,全局变量,控件。
    while (threadol->tflag) //通过线程开关控制线程1是否一直开启。
    {  
        //AfxMessageBox("hellothread"); 
        //threadol->m_static1.SetWindowTextA("第 1 个线程\n");  
        threadol->g_criticalsection.Lock(); //边界锁锁定
        // 同步锁中间可添加需要保护的操作代码,如操作txt文档读、看、写时等。
        threadol->g_criticalsection.Unlock();//边界锁解除
     }
    return 0;
}

UINT __cdecl CthreadDlg::testthread( LPVOID lparam )//线程2函数定义
{
    CthreadDlg *threadol = (CthreadDlg*)lparam;
     //线程2中写的比较简单。可以仿造线程1hellothread进行编写。
    while(threadol->tflag)
    {
        //do something
        threadol->g_criticalsection.Lock(); //边界锁锁定
        // 同步锁中间可添加需要保护的操作代码,如操作txt文档读、看、写时等。
        threadol->g_criticalsection.Unlock();//边界锁解除
    }
    return 0; 
}

③.cpp中OnInitDialog()函数中添加; //采用了两种方式来实现线程初始化,都是使用的afxBeginthread();

 tflag=TRUE;
 //将想成开关置为真。使得可以进行线程循环。


//m_pthread = AfxBeginThread(hellothread,(LPVOID)this);  


//第一个 线程1

m_pthread1 = AfxBeginThread(hellothread,this,THREAD_PRIORITY_NORMAL,0,0); 

//参数意义:(线程函数名,传递当前主对话框指针到线程函数中,普通级别,默认栈大小,自启动)

//第二个 线程2

m_pthread2=AfxBeginThread(testhread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);

//参数意义:(函数名称,当前主对话框指针,优先级为“一般”的线程,默认栈大小,创建时挂起)

④线程的暂停、开始

//以下操作如同暂停、开始可在某两个button控件的点击事件中添加,实现对线程的控制。

SuspendThread(m_pthread2->m_hThread); //挂起第二个线程。“暂停”
ResumeThread(m_pthread2->m_hThread); //释放第二个线程。”播放“

//对于suspendthread和resumethread这两个函数,其中的参数为句柄。用afxbeginthread创建的线程返回值为一个指针。不过通过这个指针m_pthread2,可以找到m_hThread。

⑤查看线程

调用任务管理器,选择进程,单击查看,单击选择列,勾选“线程”。即可在任务管理器中查看。

⑥退出关闭一个线程(以下关闭代码可以添加到某button按钮下,如ok)

较好的方式:线程函数的return 0;这样是最安全的。会释放所有资源。

例如:

void CthreadDlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码 
    tflag=FALSE;  
    //线程开关置为假
    WaitForSingleObject(m_pthread,100); 
    WaitForSingleObject(m_pthread2,100);

    g_criticalsection.Lock();
    //file.Close();
    g_criticalsection.Unlock();
    CDialogEx::OnOK();   //关闭对话框
}

不正常的方式:exitthread();

例如:

DWORD exitcode2;
GetExitCodeThread(m_pthread2,&exitcode2);
ExitThread(exitcode2);   

 //运行了这句话之后,程序直接关闭了。由于我线程创建了两个。用这句话只能结束一个线程。所以这个东西不安全。不过对于只有一个线程的,在某种情况下使用也是很快。

//2018-7-19 09:25:18 整理了代码段

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

MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出 的相关文章

随机推荐

  • gaussdb mysql对比_GaussDB(for MySQL)

    GaussDB for MySQL 是华为自研的最新一代高性能企业级分布式数据库 完全兼容MySQL 基于华为最新一代DFV分布式存储 采用计算存储分离架构 最高支持128TB的海量存储 可实现超百万级QPS吞吐 支持跨AZ部署 数据0丢失
  • Macronix MX25L25645G NOR Flash无法擦除问题分析

    1 问题现象描述 处理器使用的 SAM9X60 使用的内核版本是 5 10 80 在调试 Macronix MX25L25645G NOR Flash时 发现flash驱动加载成功后 使用 mtd debug 工具 erase flash时
  • Python期末考试答案

    文章目录 一 选择题 和 的区别 列表的操作 字典 字符串 运算 类的继承 程序阅读题 二 判断题 三 简答题 在python中 递归函数的特性是什么 阐释python是什么样的一门编程语言及应用场景 阐述类的三大特性是什么 你是如何理解的
  • 用Python的pandas读取excel文件中的数据

    一 前言 hello呀 各位铁子们大家好呀 今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据 二 读取Excel文件 使用pandas的read excel 方法 可通过文件路径直接读取 注意到 在一个excel文
  • PyQt5 按钮Button 添加事件(信号/槽)

    本文基于PyQt5 按钮Buttons样式设计 针对按钮添加响应的点击事件触发 效果截图 PyQt 模型设计 PyQt 设计器截图 UI 源码
  • 乘积怎么表示_三个连续自然数的和等于它们的乘积,求这三个数

    咋一看题目 还是不难 结果全班45人 只有2人写出解答过程 什么题 答案都能凑得出来 写不了过程 我们一起来看看这道五年级数学题 若a b c为三个连续自然数 且满足a b c abc 这三个自然数分别是多少 请写出解题过程 分析 这道题目
  • 7-3 打印沙漏

    7 3 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状 例如给定17个 要求按下列格式打印 所谓 沙漏形状 是指每行输出奇数个符号 各行符号中心对齐 相邻两行符号数差2 符号数先从大到小顺序递减到1 再从小到大顺序递增 首尾符号数
  • mybatis是如何集成到spring的之SqlSessionFactoryBean

    文章目录 1 前言 1 1 集成spring前使用mybatis的方式 1 2 集成mybatis到spring的关键步骤 2 SqlSessionFactoryBean对象分析 2 1 buildSqlSessionFactory做了什么
  • cmake的-G 参数

    一 介绍 CMake默认根据平台选择一个生成器 通常 默认生成器足以让用户继续构建软件 用户可以使用 G选项覆盖默认生成器 cmake G Ninja cmake help的输出包括一个可供用户选择的生成器列表 注意 生成器名称是区分大小写
  • php mysql 开源中国_国内最常用的PHP+MySql免费CMS网站系统大全

    1 DEDE 这是一款国内开源的cms 作者是一个个人 能做出如此功能的cms 是相当不错的 2007版功能十分强大 希望能改善之前数据量一大 更新静态页就很慢的缺点 因为开源 有较多的玩家和拥护者 非常适合有一定编程基础的站长 2 php
  • 图解循环单链表(含C代码)

    目录 1什么是循环单链表 2好处是什么呢 3操作的差异 4代码 1什么是单向循环链表 单向循环链表对比单链表 其实只有一个地方的差异 那就是 尾结点的指针域不是指向空 而是指向了头结点 使其形成了一个环 2好处是什么呢 链表从链尾到链头很方
  • Windows内核面试题(持续更新,目前完成度30%约1.8万字)

    WINDOWS内核编程问题与答案 1 WDK和SDK的区别是什么 2 WDK全称叫做 3 如何创建WDK程序 4 WinDbg如何连接虚拟机 5 Windows内核符号表的作用 6 如何设置内核符号表与源文件 7 如何设置断点与源码调试 8
  • intel android haxm,使用Intel HAXM为Android模拟器加速,媲美真机

    Intel HAXM Hardware Accelerated Execution Manager 使用基于 Intel R Virtualization Technology VT 的硬件加速 因此需要 CPU 支持 VT 而且仅限于 I
  • 定位技术课程设计-微信小程序校园导游系统

    定位技术课程设计课程设计教学目的课程设计要求课程设计题目原题目拓展内容需求分析原理分析微信小程序API定位原理WIFI指纹定位原理路径规划算法调研详细设计总述主页面介绍学校简介页面介绍导引页面概述导引地图景点列表景点详细介绍页面搜索界面导航
  • 测试下几个网络相册

    1 百度相册外链分享 优点 国内站 速度快 可以批量上传 缺点 右下角会有水印 很是不爽 2 试下Photobucket 免费 无水印
  • 第一次CCF CSP认证体验

    今天是我第一次参加CCF CSP认证 虽然这已经是第十二次CCF认证了 感觉题目有点难欸 前面两道题暴力写完 然后看了第三题 哇 简直难写 第四题看了看 数据1e5条边 不会做 就写了一个暴力 希望能过点数据 第五题感觉像是一个动态规划 完
  • HTML(HBuilder)作业题10- 用户登录(jquery)

    问 简单的用户登录怎么弄 答 1 利用jquery 2 利用if 注释 用鼠标离开区域开始判断 可以自行尝试修改成click单击按钮 HBuilder
  • 【华为OD机试真题 Python】最多等和不相交连续子序

    前言 本专栏将持续更新互联网大厂机试真题 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于大厂机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun0
  • mmdetection常见报错以及解决方案汇总

    目录 1 MMCV 安装相关 1 MMCV 与 MMDetection 的兼容问题 ConvWS is already registered in conv layer AssertionError MMCV xxx is used but
  • MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

    MFC之AfxbeginThread 线程 创建 挂起 释放 结束 退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程 两种方法 使用默认设置 使用自主设置参数 以及一些如同 挂起 释放 边界锁等操作 h文件添加声明