// 申明
class CManageThread
{
public:
CManageThread();
virtual ~CManageThread();
private:
HANDLE m_HThread;//线程句柄
HANDLE m_HEvent;//结束空闲线程通知
IThreadExcute* m_te;
CSemaphore
*m_section;
public:
bool ExcuteThread();
//-----------------------------------
bool PostExitThread();
bool
TerminateExitThread();
//-----------------------------------
HANDLE
GetThreadEvent();//获取通知句柄
HANDLE GetThreadHandle();//获取线程句柄
bool
GetThreadIsLeisure();
void SetThreadExcute(IThreadExcute *pte);
void
SetThreadHandle(HANDLE handle);
//---------------------------------------------
//锁定当前线程
bool
SetLockThread(int tm=0);
};
class CTemporarilyThread
{
public:
CTemporarilyThread();
virtual ~CTemporarilyThread();
private:
HANDLE m_HThread;
IThreadExcute* m_te;
public:
bool TerminateExitThread();
bool ExcuteThread();
HANDLE
GetThreadHandle();//获取线程句柄
void SetThreadExcute(IThreadExcute *pte);
void SetThreadHandle(HANDLE handle);
};
class
CThreadPoolManage
{
private:
CThreadPoolManage();
virtual
~CThreadPoolManage();
private:
static CThreadPoolManage*
m_ChreadPoolManage;
static
CArray<CTemporarilyThread*,CTemporarilyThread*> m_ATemporarily;
static
CArray<CManageThread*,CManageThread*> m_AManageThread;
static
CSemaphore m_sem;
static CCriticalSection section;
public:
static CThreadPoolManage* GetThreadPoolManage();
static void
CloseThreadPoolManage();
private:
//装载临时任务
static DWORD WINAPI
ExcuteMission(LPVOID n);
//装载空闲任务
static DWORD WINAPI
ExcuteLeisureMission(LPVOID n);
private:
public:
bool
AddMission(IThreadExcute* pte);//添加任务
bool SatartTemporarilyThread(int
count);//启动一到多个空闲线程
int CloseTemporarilyThread(int count);//关闭一到多个空闲线程
bool CloseTemporarilyThreadAll();//关闭所有空闲线程
int
GetThreadPoolCount();//获取当前远行的线程数量
};
class IThreadExcute
{
public:
IThreadExcute();
virtual ~IThreadExcute();
public:
virtual void ExcuteThread();
};
// 实现
CManageThread::CManageThread()
{
m_HThread = NULL;
m_te =
NULL;
m_HEvent = NULL;
m_section = new CSemaphore(1,1);
m_section->Unlock();
}
CManageThread::~CManageThread()
{
delete m_section;
CloseHandle(m_HEvent);
}
bool
CManageThread::ExcuteThread()
{
try
{
while(1)
{
if(WaitForSingleObject(m_HEvent,0)!=WAIT_TIMEOUT)
{
ResetEvent(m_HEvent);
break;
}
try
{
if(m_te!=NULL)
m_te->ExcuteThread();
m_section->Unlock();
}
catch(...)
{
m_te
= NULL;
m_section->Unlock();
}
m_te = NULL;
}
}
catch(...)
{
ResetEvent(m_HEvent);
m_section->Unlock();
m_te = NULL;
return false;
}
m_section->Unlock();
m_te = NULL;
return true;
}
bool CManageThread::PostExitThread()
{
try
{
if(m_HEvent!=NULL)
SetEvent(m_HEvent);
}
catch(...)
{
return false;
}
return true;
}
bool
CManageThread::TerminateExitThread()
{
try
{
if(m_HThread!=NULL)
TerminateThread(m_HThread,0);
m_section->Unlock();
}
catch(...)
{
m_section->Unlock();
return false;
}
return true;
}
HANDLE CManageThread::GetThreadEvent()
{
return m_HEvent;
}
void CManageThread::SetThreadExcute(IThreadExcute *pte)
{
m_te =
pte;
}
HANDLE CManageThread::GetThreadHandle()//获取线程句柄
{
return
m_HThread;
}
bool CManageThread::GetThreadIsLeisure()
{
return
(m_te==NULL)?true:false;
}
void CManageThread::SetThreadHandle(HANDLE
handle)
{
m_HThread = handle;
CString EventStr;
EventStr.Format("%d",m_HThread);
m_HEvent =
CreateEvent(NULL,true,false,EventStr);
ResetEvent(m_HEvent);
}
//锁定当前线程
bool CManageThread::SetLockThread(int tm)
{
return
(m_section->Lock(tm)==0)?false:true;
}
CTemporarilyThread::CTemporarilyThread()
{
m_HThread = NULL;
m_te = NULL;
}
CTemporarilyThread::~CTemporarilyThread()
{
}
bool CTemporarilyThread::TerminateExitThread()
{
try
{
if(m_HThread!=NULL)
TerminateThread(m_HThread,0);
}
catch(...)
{
return false;
}
return true;
}
bool CTemporarilyThread::ExcuteThread()
{
try
{
if(m_te!=NULL)
m_te->ExcuteThread();
}
catch(...)
{
return false;
}
return true;
}
HANDLE
CTemporarilyThread::GetThreadHandle()//获取线程句柄
{
return m_HThread;
}
void CTemporarilyThread::SetThreadExcute(IThreadExcute *pte)
{
m_te = pte;
}
void CTemporarilyThread::SetThreadHandle(HANDLE
handle)
{
m_HThread = handle;
}
CThreadPoolManage::CThreadPoolManage()
{
}
CThreadPoolManage::~CThreadPoolManage()
{
}
CThreadPoolManage*
CThreadPoolManage::m_ChreadPoolManage = NULL;
CArray<CManageThread*,CManageThread*>
CThreadPoolManage::m_AManageThread;
CArray<CTemporarilyThread*,CTemporarilyThread*>
CThreadPoolManage::m_ATemporarily;
//初始化信号量
CSemaphore
CThreadPoolManage::m_sem(MAX_THREAD,MAX_THREAD);
CCriticalSection
CThreadPoolManage::section;
CThreadPoolManage*
CThreadPoolManage::GetThreadPoolManage()
{
if(m_ChreadPoolManage==NULL)
{
m_ChreadPoolManage = new
CThreadPoolManage();
m_AManageThread.RemoveAll();
m_ATemporarily.RemoveAll();
}
return m_ChreadPoolManage;
}
void CThreadPoolManage::CloseThreadPoolManage()
{
delete
m_ChreadPoolManage;
m_ChreadPoolManage = NULL;
}
DWORD WINAPI
CThreadPoolManage::ExcuteMission(LPVOID n)
{
CTemporarilyThread* pte =
(CTemporarilyThread*)n;
CTemporarilyThread* ptef = NULL;
int i = 0;
if(pte!=NULL)
{
try
{
pte->ExcuteThread();
}
catch(...)
{
}
}
if(pte!=NULL)
{
try
{
while(section.Lock(10000)==0);
for(i=0;i<m_ATemporarily.GetSize();i++)
{
ptef =
m_ATemporarily.GetAt(i);
if(pte->GetThreadHandle()==ptef->GetThreadHandle())
{
m_ATemporarily.RemoveAt(i);
delete ptef;
break;
}
}
section.Unlock();
}
catch(...)
{
section.Unlock();
}
}
m_sem.Unlock();
pte = NULL;
ptef = NULL;
return 0;
}
//装载空闲任务
DWORD WINAPI CThreadPoolManage::ExcuteLeisureMission(LPVOID n)
{
CRegKeyIni ini;
int i = 0;
CManageThread* pmt = NULL;
CManageThread* pManageThread = (CManageThread*)n;
if(pManageThread!=NULL)
{
try
{
pManageThread->ExcuteThread();
}
catch(...)
{
}
}
//----------删除除在队列中的记录---------------------
if(pManageThread != NULL)
{
while(section.Lock(10000)==0);
CString str2,str1;
CTime tm = CTime::GetCurrentTime();
str2.Format("%d:%d:%d",tm.GetHour(),tm.GetMinute(),tm.GetSecond());
str1.Format("%d===hhhhhhhhhhh",pManageThread->GetThreadEvent());
ini.WriteIniStringAndCurrentDir(str1,str2,"123456","wangwei.ini");
try
{
for(i=0;i<m_AManageThread.GetSize();i++)
{
pmt = m_AManageThread.GetAt(i);
if(pmt!=NULL)
if(pmt->GetThreadHandle()==pManageThread->GetThreadHandle())
{
m_AManageThread.RemoveAt(i);
CString
str,str1;
CTime tm = CTime::GetCurrentTime();
str1.Format("%d:%d:%d",tm.GetHour(),tm.GetMinute(),tm.GetSecond());
str.Format("%d",pmt->GetThreadEvent());
ini.WriteIniStringAndCurrentDir(str,str1,"ww","tt.ini");
delete pmt;
break;
}
}
section.Unlock();
}
catch(...)
{
section.Unlock();
}
}
m_sem.Unlock();
pmt = NULL;
pManageThread = NULL;
//---------------------------------------------------
return 0;
}
bool CThreadPoolManage::AddMission(IThreadExcute* pte)
{
CTemporarilyThread* ptt = NULL;
CManageThread* pmt = NULL;
int i
= 0;
DWORD id = 0;
HANDLE handle = NULL;
if(m_sem.Lock()==0)//任务已满
return false;
try
{
//-----------查询是否存在空闲线程------------------
if(section.Lock(10000)!=0)
{
for(i=0;i<m_AManageThread.GetSize();i++)
{
pmt =
(CManageThread*)m_AManageThread.GetAt(i);
if(pmt->SetLockThread())
{
pmt->SetThreadExcute(pte);
break;
}
}
if(i==m_AManageThread.GetSize())//不存在已经启动空闲线程
{
ptt = new CTemporarilyThread();
handle =
CreateThread(NULL,NULL,ExcuteMission,(LPVOID)ptt,CREATE_SUSPENDED,&id);
ptt->SetThreadHandle(handle);
ptt->SetThreadExcute(pte);
m_ATemporarily.Add(ptt);
ResumeThread(handle);
}
section.Unlock();
}
else return false;
//-------------------------------------------------
}
catch(...)
{
section.Unlock();
return false;
}
return true;
}
bool CThreadPoolManage::SatartTemporarilyThread(int count)//启动一到多个空闲线程
{
int i = 0;
CManageThread* pmt = NULL;
HANDLE handle = NULL;
DWORD id = 0;
if(count>(MAX_LEISURE-m_AManageThread.GetSize()))
return false;
for(i=0;i<count;i++)
{
pmt =
new CManageThread();
handle =
CreateThread(NULL,NULL,ExcuteLeisureMission,(LPVOID)pmt,CREATE_SUSPENDED,&id);
pmt->SetThreadHandle(handle);
m_AManageThread.Add(pmt);
ResumeThread(handle);
}
return true;
}
//关闭一到多个空闲线程,返回实际关闭的空闲线程数量
int
CThreadPoolManage::CloseTemporarilyThread(int count)
{
int i = 0;
int js = 0;
CManageThread* pmt = NULL;
if(count >
m_AManageThread.GetSize())
return -1;
if(section.Lock(10000)!=0)
{
try
{
for(i=(count-1);i>=0;i--)
{
pmt = m_AManageThread.GetAt(i);
if(pmt->SetLockThread())
{
if(pmt->PostExitThread())
{
if(!pmt->SetLockThread(1000))
{
pmt->TerminateExitThread();
m_AManageThread.RemoveAt(i);
delete pmt;
}
}
js++;
}
}
section.Unlock();
}
catch(...)
{
section.Unlock();
}
}
return js;
}
bool CThreadPoolManage::CloseTemporarilyThreadAll()//关闭所有线程池线程
{
CRegKeyIni ini;
CTemporarilyThread* ptt = NULL;
CManageThread* pmt
= NULL;
int i = 0;
int count = 0;
int js = 0;
while(section.Lock(10000)==0);
CString str2;
CTime tm =
CTime::GetCurrentTime();
str2.Format("%d:%d:%d",tm.GetHour(),tm.GetMinute(),tm.GetSecond());
ini.WriteIniStringAndCurrentDir("HHHHHHHHH",str2,"123456","wangwei.ini");
try
{
count = m_AManageThread.GetSize();
for(i=(count-1);i>=0;i--)
{
pmt =
m_AManageThread.GetAt(i);
if(pmt->PostExitThread())
{
if(!pmt->SetLockThread(1000))
{
pmt->TerminateExitThread();
m_AManageThread.RemoveAt(i);
CString str,str1;
CTime tm = CTime::GetCurrentTime();
str1.Format("%d:%d:%d",tm.GetHour(),tm.GetMinute(),tm.GetSecond());
str.Format("%d",pmt->GetThreadEvent());
ini.WriteIniStringAndCurrentDir(str,str1,"123456","tt.ini");
delete
pmt;
}
js++;
}
}
CString str;
str.Format("%d",js);
::AfxMessageBox(str);
count =
m_ATemporarily.GetSize();
for(i=(count-1);i>=0;i--)
{
ptt = m_ATemporarily.GetAt(i);
ptt->TerminateExitThread();
m_ATemporarily.RemoveAt(i);
delete ptt;
}
section.Unlock();
}
catch(...)
{
section.Unlock();
return false;
}
return
true;
}
int CThreadPoolManage::GetThreadPoolCount()//获取当前远行的线程数量
{
return m_AManageThread.GetSize()+m_ATemporarily.GetSize();
}
注:CManageThread负责管理单个线程,CThreadPoolManage负责管理线程池,单例实现
相关推荐
C#管理线程池的类ThreadManager
C#管理线程池的类 /* How to use Thread Classs * * ============== * public ELMService() { InitializeComponent(); etm.ClalThreadPool("EmailThreads", (uint)ApplicationInfo.EmailParsingThreads); } * //queue items in thread for processing. * etm.QueueUserEmailWorkItem(new WaitCallback(ELMService_UpdateLogHandler), objSupplier); public void ELMService_UpdateLogHandler(object objmsg) * { * return; * } * */
线程池及Spring Boot举例
创建线程池:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) corePoolSize:线程池的基本大小 m...
实现了ThreadManager类,在程序中自动管理线程(15kb)
实现了ThreadManager类,在程序中自动管理线程(15kb)
Tool.Net 开源-ManagedThreadPool类
移除Tool.Utils.ManagedThreadPool类 移除原因:因为.net5中已经将Thread类中很多线程操作函数,声明为已过时,导致用户无法正常使用该类,现将该类公开。 源码公开如下: using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Threading; namespace Tool.Utils { /// <
Java Task-Thread Manager-开源
线程和任务管理器。 在线程池中执行任务。
2026年ERP选型实战:按规模分档,避开成本与实施陷阱
企业资源计划(ERP)是现代企业数字化转型的核心系统,它将财务、供应链、制造、人力等业务整合到统一平台。随着云计算和人工智能技术的发展,ERP已从传统本地部署的记录工具演变为SaaS订阅制、具备AI辅助决策能力的智能运营平台。不同规模企业在选型时的关注点差异巨大:小微企业追求轻量化和快速出报表,中型企业需要在流程标准化与业务灵活性间取得平衡,大型集团则注重多法人管控和数据治理。此外,制造、电商、工程等行业对ERP的模块要求也各有侧重,成本核算数据跑不通更是普遍痛点。如何结合企业规模与行业特征,制定合理的选型
java threadpoolmanager_理解Java线程池ThreadPoolExecutor
在Java的线程池的使用会有比较多的地方,有比较多的应用场景,介绍一下Java线程池ThreadPoolExecutor。线程是一个操作系统概念。操作系统负责这个线程的创建、挂起、运行、阻塞和终结操作。而操作系统创建线程、切换线程状态、终结线程都要进行CPU调度----这是一个耗费时间和系统资源的事情。大多数实际场景中是这样的:处理某一次请求的时间是非常短暂的,但是请求数量是巨大的。这种背景下,如...
为什么桥式传感器(Bridge Sensor)需要用到仪表放大器?
仪表放大器在桥式传感器的应用里起到关键作用,本文介绍桥式传感器的原理、特性,以及信号调理过程,并附上了一个 TINA - TI 的仿真电路。
ThreadManager分析
类图如下: ThreadManager是采用单例模式创建的:ThreadManager* ThreadManager::Instance() { RTC_DEFINE_STATIC_LOCAL(ThreadManager, thread_manager, ()); return &thread_manager; }#define RTC_DEFINE_STATIC_LOCAL(type,
stm32f407等芯片(HAL库)时钟频率修改(乱码)
其他片子及库文件未知、未验证,只是在使用stm32f407ZG配置串口打印的时候,出现乱码,就从以下几方面定位问题: 1. 确认串口GPIO相关配置; 2. 确认波特率等参数; 3. 确认时钟频率; 结果这次使用YH的串口打印程序在ZDYZ的开发板调试项目工程(有点另类...),做功能验证,就出现了以上问题,出于好奇开始调试,最终发现是时钟频率问题。 看到下图这个配置,因为ZDYZ开发板使用的是8MHz外部晶振(好像默认的是25MHz,如图2),所以他这里PLL_M是25,不是推荐值,感...
华为使用MicroG安装并使用Google服务教程
鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)
threadmanage
////threadmanage.h #pragma once #ifndef THREADMANAGE_H #define THREADMANAGE_H //#include "SAStatusLog.h" #include "DealData.h" #include "ErgodicFile.h" #include #include #include #inclu
opencode 完全指南:终端AI编程助手的安装、模型配置与实战
在AI编程助手快速迭代的当下,开发者对终端环境下的自动化编码需求愈发强烈。以自然语言驱动代码修改、命令执行与测试验证,已成为提升工程效率的重要方向。这类工具普遍遵循模型无关的设计原则,通过兼容OpenAI格式的接口接入多种大模型,并借助多会话管理、Skills、Memory等机制实现可审查、可干预的闭环流程。从安装配置到日常使用,再到apihub网关与免费模型的接入,终端AI助手在代码审查、跨文件重构、浏览器自动化验证等场景中展现出独特价值。本文聚焦opencode这一开源CLI工具,详细拆解其核心定位、模
C++线程池管理
管理C++线程池涉及创建、调度和终止线程的机制,以有效地处理并发任务。以下是一个基本的线程池管理示例,包括线程池的创建、任务分配和线程池的销毁。
把 SAP 输出稳稳落到 PDF:从 SPAD 前端打印到 ABAP 程序级转换的一套方法
摘要:本文介绍了三种在SAP系统中将报表输出转为PDF文件的方法。路线A通过SPAD配置前端输出设备,结合Windows打印机设置实现用户交互式PDF保存;路线B在SP01事务码中将已有Spool请求另存为PDF,适用于补救导出;路线C通过ABAP程序自动转换Spool为PDF,适合批量处理。文章详细说明了配置步骤,并针对常见问题(如乱码、文件格式错误等)提供了排查思路。三种方案分别适用于不同场景,用户可根据实际需求选择最合适的PDF导出方式。
【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?
如何查看 WPS 的输入静态地理数据(二进制格式)?
线程池管理类和线程池类
一.线程池管理类 /** * 线程池管理类 */ public class ThreadPoolFactory { private static final Log logger = LogFactory.getLog(ThreadPoolFactory.class); /** * 放入管理线程池线程间隔时间 */ private final static int PUT_DEFAULTPOOL_INTERVAL = 3;
Ultralytics 框架中 model.predict() 返回的 results 对象的详细解析
通过掌握 results 对象的使用方法,您可以快速实现模型部署、数据分析与可视化。
统一管理项目线程池
利用Spring容器的生命周期管理特性,在Spring容器关闭时自动触发线程池的关闭操作,从而简化了代码逻辑,提高了系统的可维护性。首先,我们创建了一个统一的线程池,它的目的是将系统中所有的线程管理集中起来,确保资源的有效利用和系统的稳定运行。例如,Spring提供了线程池的优雅关闭功能,当应用需要停止时,它可以逐步关闭线程池,确保正在执行的任务能够完成后再停止线程,从而避免了任务中断或数据丢失的风险。一个可行的方案是引入统一的线程池配置,以替代之前自建的线程和线程池。
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
efm32 入门.pdf
本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。
线程池如何管理线程
本篇介绍一下CLR中,线程池是如何管理线程的。在介绍之前,先说明下线程池的设置。 一:线程池设置: 一般不建议设置线程数,就像从来都不会限制程序使用的内存量,或限制使用的网络带宽。 1:默认拥有的线程数大约是1000个线程。 2:32位进程最多能够有大约1360个线程。 3:64位进程理论上可以创建千百万个线程。 二:如何管理工作者线程: 我们先了解下全局对列和本地对列的区别: 1:全局对列: ...
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
如何优雅的管理线程池
在开发中、我们经常会碰到一个工程中会用到多个线程池,在代码中、我们大多会在当前业务代码里直接创建线程池,如果有多个功能去创建多个线程池、在不同地方是不方便我们管理的、其他开发同事也并不会对每个业务很熟悉、在开发时便会有不必要的工时浪费。那么我们如何优雅的管理线程池呢?
visio安装包
Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。
线程池的管理
一、 线程池的原理: 线程池,究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下: 先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。 可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的...
在Spring Boot项目中实现全局线程池管理、动态线程池、线程池监控和线程池编排
Java spring boot 实现全局线程池管理、动态线程池、线程池监控、线程池编排
如何优雅地统一管理项目的线程池
如何优雅地增加统一线程池配置,替换掉自建线程和线程池。
线程池管理(1)-为什么需要线程池
摘要 为什么需要线程池呢,没想明白这个问题,看再多线程池的源码都没有用,先要知道线程池技术解决了什么问题,才能看的懂源码。因为所有的代码都是为了解决问题 问题 抛几个问题,看看你是否知道,不知道的话,可能你对线程池的理解还不够深入,还是一知半解。 ...
313



被折叠的 条评论
为什么被折叠?



