主线程用afxBeginThread()创建多个线程安全退出的办法
HANDLE hand[];
CCriticalSection m_crisecoin;
CEvent m_event;
struct Student
{
int nNO;
int nYear;
CWnd *wnd;
BOOL bExit;
};
Student stdent;
//创建线程
void CMyDlg::OnBnClickedButtonBegin()
{
stdent.nNO = ;
stdent.nYear = ;
stdent.wnd = this;
stdent.bExit = FALSE; pThread[] = AfxBeginThread( threadADD , &stdent );
pThread[] = AfxBeginThread( threadADD1 , &stdent );
hand[] = CreateEvent( NULL,FALSE,FALSE , NULL );//这个是事项
hand[] = CreateEvent( NULL,FALSE,FALSE , NULL );
}
//线程里面的程序 UINT threadADD( LPVOID p )
{
Student *pStudent = ( Student *)p;
for ( int i = ; i < ; i++ )
{
if ( pStudent->bExit )
{
SetEvent(hand[]);
return ;
}
::SendMessage( pStudent->wnd->GetSafeHwnd() , WM_USER_ADD , pStudent->nNO++, );
Sleep();
}
return ;
} UINT threadADD1( LPVOID p )
{
Student *pStudent = ( Student *)p;
for ( int i = ; i<; i++ )
{
if ( pStudent->bExit )
{
SetEvent( hand[]);
return ;
}
::SendMessage( pStudent->wnd->GetSafeHwnd() , WM_USER_ADD1 , (pStudent->nYear)--,);
Sleep( );
}
return ;
} 退出程序:
BOOL CMyDlg::ExistThread()
{
m_crisecoin.Lock();
stdent.bExit = TRUE;
m_crisecoin.Unlock();
DWORD dwWait =;
dwWait = ::WaitForMultipleObjects( , hand , TRUE,INFINITE);
return TRUE;
}
//挂起线程;
void CMyDlg::OnBnClickedButtonSuperthread()
{
SuspendThread( pThread[]->m_hThread );
SuspendThread( pThread[]->m_hThread );
}
//唤起线程
void CMyDlg::OnBnClickedButtonResunme()
{
ResumeThread( pThread[]->m_hThread );
ResumeThread( pThread[]->m_hThread ); }
主线程用afxBeginThread()创建多个线程安全退出的办法的更多相关文章
- day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁
一.线程 1.进程:资源的分配单位 线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...
- android 避免线程的重复创建(HandlerThread、线程池)
最近在android开发中,用到都是new Thread(){...}.start()这种方式.本来这样是可以,但是最近突然爆出Performing stop of activity that is ...
- java线程基础巩固---创建并启动线程
对于java的并发编程方面的东东,不管是面试还是实际工作开发都是非常重要的,而往往只要涉及到并发相关的东东有点让人觉得有点难,而实际工作中涉及到并发可能就是简单的用下同步块.上锁之类的一些简单的操作, ...
- Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...
- UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程
lienhua342014-11-08 在进程控制三部曲中我们学习了进程的创建.终止以及获取终止状态等的进程控制原语.线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语. ...
- JAVA线程池的创建与使用
为什么要用线程池? 我们都知道,每一次创建一个线程,JVM后面的工作包括:为线程建立虚拟机栈.本地方法栈.程序计数器的内存空间(下图可看出),所以线程过多容易导致内存空间溢出.同时,当频繁的创建和销毁 ...
- Java线程池实现原理之自定义线程池(一)
1.队列的概念 谈到多线程先讲下队列的概念,之后的多线程学习会用到此类知识. 队列分为:阻塞式队列(有界).非阻塞式队列(无界),遵循着先进先出.后进后出的原则.阻塞队列与非阻塞队列区别: 1.非阻塞 ...
- 线程池的类型以及执行线程submit()和execute()的区别
就跟题目说的一样,本篇博客,本宝宝主要介绍两个方面的内容,其一:线程池的类型及其应用场景:其二:submit和execute的区别.那么需要再次重申的是,对于概念性的东西,我一般都是从网上挑选截取,再 ...
- Java多线程学习总结--线程概述及创建线程的方式(1)
在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...
随机推荐
- 将字符串按照一行N个内容展示,并保存到txt文档当中
str='丰东股份的 反倒是 发送到 电风扇发 的说法是 反倒是 aEQWW WERQR ERREW 34R32 ER 32432 32423 432142 234321 134214 32424 3 ...
- 【HBase】知识小结+HMaster选举、故障恢复、读写流程
1:什么是HBase HBase是一个高可靠性,高性能,面向列,可伸缩的分布式数据库,提供海量数据存储功能,一个结构化的分布式存储系统,不同于一般的关系型数据库,它适合半结构化和非结构化数据存储. 2 ...
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
- 数据库之 MySQL --- 下载、安装 及 概述(一)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一 . MySql数据库的安装 1.图解MySQL程序结构 2.双击运行安装程序:以Win32位为例 ...
- Java实现空瓶换汽水
1 空瓶换汽水 浪费可耻,节约光荣.饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料.刚好小明前两天买了2瓶该饮料喝完了,瓶子还在.他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一 ...
- Java实现第十届蓝桥杯求和
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- 循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数
在我们使用VUE+Element 处理界面的时候,往往碰到需要利用JS集合处理的各种方法,如Filter.Map.reduce等方法,也可以设计到一些对象属性赋值等常规的处理或者递归的处理方法,以前对 ...
- Java虚拟机性能调优(一)
Java虚拟机监控与调优,借助Java自带分析工具. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat:JVM Statistics M ...
- 03.Java的前世今生
C&C++ 1972年C诞生 ◆贴近硬件,运行极快,效率极高. ◆操作系统,编译器,数据库,网络系统等 ◆指针和内存管理 1982年C++诞生 ◆面向对象 ◆兼容C ◆图形领域.游戏等 背景 ...
- 循环使用 v-for 指令。
循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名. v-for 可以绑定数据到 ...