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

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

①.h文件添加声明

public:CWinThread *m_pthread;CWinThread *m_pthread2; static UINT __cdecl  hellothread(LPVOID lparam); //4.掐指算了一下。说是>vs 2005的编译器定义线程函数都需要添加两个宏,即UINT _cdeclstatic 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 整理了代码段

原文:https://blog.csdn.net/i_likechard/article/details/51544120

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

  1. JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法)

    JAVASE基础模块三十五( 线程 线程创建的第一种方法 以及线程的一些方法) 线程 首先要清楚的是 线程依赖于进程 进程 是 正在运行的应用程序 一个正在运行的应用程序 是个进程 这个应用程序又要执 ...

  2. VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)

    这里废话不多讲了,因为项目原因,需要开启线程进行处理,在不了解线程的情况下,直接百度一下,然后就使用了,结果可想而知,出现了异常,所以花了一天时间系统学习一下多线程,这里主要是针对win32编程方面的 ...

  3. MFC 多线程及线程同步

    一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...

  4. MFC多线程各种线程用法 .

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为 IDC_SLEEP_SI ...

  5. 在MFC里面实现线程的实例

    线程是一种从软件到硬件的技术,主要目的是为了提高运行速度,和多任务. ××××××××××××××××××××××××××××××××××××需要储备的资料(他人的)××××××××××××××××× ...

  6. VC多线程编程之线程创建与示例

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...

  7. VC++中多线程学习(MFC多线程)二(线程的相关操作、线程间的通信)

    上一篇笼统介绍了如何创建线程以及线程如何和类成员函数通信,本篇将主要介绍: 线程的相关操作 1.线程的挂起和恢复:SuspendThread.ResumeThread 在线程创建并运行后,用户可以对线 ...

  8. VC++ MFC 多线程及线程同步(详细、全面总结!)

    更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC    多线程及线程同步                          ...

  9. 使用线程——创建线程

    CreateThread函数创建一个进程的新的线程.创建线程必须指定新线程要执行的代码的起始地址.通常,起始地址是程序代码中定义的函数的名称(有关更多信息,请参阅ThreadProc).此函数采用单个 ...

最新文章

  1. Linux Shell简介
  2. Java基础学习总结(31)——Java思维导图
  3. ProxylessNAS pytorch
  4. tokyo cabinet java_Tokyo Cabinet的安装,含Java版(CentOS 5.4)
  5. 遭遇“长租杀熟”,95后蜗居的长租公寓未来也是“扑朔迷离”?
  6. P6563-[SBCOI2020]一直在你身旁【dp,单调队列】
  7. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
  8. opencart笔记
  9. asx根据时间点播放
  10. 视频聊天软件的快速开发(QT5.3)
  11. 计算机图形学期末复习知识点总结
  12. NO.16——Pathon爬取杨超越新浪微博数据做词云分析
  13. 单工通信、半双工通信、全双工通信 的概念
  14. 五金机械行业网站建设方案
  15. 草根方式学习java中的多线程
  16. 【C++】memset函数
  17. 插入排序-一函数实现升降序的两种方式
  18. shell编程实例1--参数表示
  19. 免费ARP(Gratuitousnbsp;ARP)简析
  20. 5月6阴阳师服务器维护,阴阳师5月6日正式服维护更新内容:跨区斗技聊天开启 僵尸寮会解散...

热门文章

  1. 保定 机器人焊接加工厂_满城招聘|双休+五险+国企保定乐凯设备制造安装有限公司招聘满城1.6招聘信息...
  2. 我的世界java版tis,我的世界1.7.10~1.8.8 9tis-3d回到汇编的时代mod
  3. python unit test 访问开发代码_python unittest 源码分析
  4. java向飞秋发文件_Java 给飞秋发送消息
  5. 一般控制矩阵转能观标准型
  6. latex 小于_一份菜鸡的Latex课堂作业works--(ii)
  7. 给php权限,PHP实现权限管理功能的方法
  8. Android 数据库制作APP,在Android 中使用Anko框架制作一个完整的App,第二集
  9. 你的元器件为什么会无缘无故地失效了?
  10. 高倍数泡沫装置PHP_找煤机网:BGP高倍数泡沫灭火装置