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()创建多个线程安全退出的办法的更多相关文章

  1. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  2. android 避免线程的重复创建(HandlerThread、线程池)

    最近在android开发中,用到都是new Thread(){...}.start()这种方式.本来这样是可以,但是最近突然爆出Performing stop of activity that is ...

  3. java线程基础巩固---创建并启动线程

    对于java的并发编程方面的东东,不管是面试还是实际工作开发都是非常重要的,而往往只要涉及到并发相关的东东有点让人觉得有点难,而实际工作中涉及到并发可能就是简单的用下同步块.上锁之类的一些简单的操作, ...

  4. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  5. UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程

    lienhua342014-11-08 在进程控制三部曲中我们学习了进程的创建.终止以及获取终止状态等的进程控制原语.线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语. ...

  6. JAVA线程池的创建与使用

    为什么要用线程池? 我们都知道,每一次创建一个线程,JVM后面的工作包括:为线程建立虚拟机栈.本地方法栈.程序计数器的内存空间(下图可看出),所以线程过多容易导致内存空间溢出.同时,当频繁的创建和销毁 ...

  7. Java线程池实现原理之自定义线程池(一)

    1.队列的概念 谈到多线程先讲下队列的概念,之后的多线程学习会用到此类知识. 队列分为:阻塞式队列(有界).非阻塞式队列(无界),遵循着先进先出.后进后出的原则.阻塞队列与非阻塞队列区别: 1.非阻塞 ...

  8. 线程池的类型以及执行线程submit()和execute()的区别

    就跟题目说的一样,本篇博客,本宝宝主要介绍两个方面的内容,其一:线程池的类型及其应用场景:其二:submit和execute的区别.那么需要再次重申的是,对于概念性的东西,我一般都是从网上挑选截取,再 ...

  9. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

随机推荐

  1. Multiple annotations found at this line:- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    解决办法: 右键所在项目 build path configure build path java build path Add Library server Run time (Apache Tom ...

  2. Java实现 蓝桥杯 算法提高 分解质因数(暴力)

    试题 算法提高 分解质因数 问题描述 给定一个正整数n,尝试对其分解质因数 输入格式 仅一行,一个正整数,表示待分解的质因数 输出格式 仅一行,从小到大依次输出其质因数,相邻的数用空格隔开 样例输入 ...

  3. Java实现 蓝桥杯 算法提高 01背包

    算法提高 01背包 时间限制:1.0s 内存限制:256.0MB 问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入 ...

  4. Java实现 蓝桥杯算法提高金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...

  5. Java实现 LeetCode 409 最长回文串

    409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意 ...

  6. Java实现 蓝桥杯VIP 算法训练 暗恋

    算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...

  7. Java实现 LeetCode 100 相同的树

    100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [ ...

  8. Java实现 LeetCode 58 最后一个单词的长度

    58. 最后一个单词的长度 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度. 如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词, ...

  9. Elasticsearch系列---生产集群部署(下)

    概要 本篇继续讲解Elasticsearch集群部署的细节问题 集群重启问题 如果我们的Elasticsearch集群做了一些离线的维护操作时,如扩容磁盘,升级版本等,需要对集群进行启动,节点数较多时 ...

  10. 二叉树的层次序列化和反序列化-----stringstream

    string serialize(TreeNode* root) {//层序便利,将空的子节点也放入到字符串 ostringstream out; queue<TreeNode*> q; ...