多线程生命监控

监控类:通过线程时间监控其他线程是否存活

//wanglb6
/*通过所需监控对象时间成员的变换,来判断线程是否活跃*/
#pragma once
#include "FtpScan.h"

class ChbServer
{
public:
	ChbServer(void);
	~ChbServer(void);
	static DWORD WINAPI DiffTime(void *pParam);
	int run(CFtpScan * pFtpScan);
	void ErrMsg(const char *pchErrorMsg);
private:
	T_THREADINFO *m_pThreadInfo;
	CFtpScan * m_pFtpScan;			//所需监控对象指针
};


#include "StdAfx.h"
#include "ChbServer.h"

ChbServer::ChbServer(void)
{
	m_pThreadInfo = new T_THREADINFO;
	m_pFtpScan = NULL;
}

ChbServer::~ChbServer(void)
{
	delete m_pThreadInfo;
	m_pThreadInfo = NULL;
	m_pFtpScan= NULL;
}
DWORD ChbServer::DiffTime(void *pParam)
{
	//静态方法获取当前对象指针
	ChbServer * phbServer = (ChbServer * )pParam;
	while(1)
	{
		SYSTEMTIME sTime;
		GetLocalTime(&sTime);
		//扫描时间判定
		int iDiffTime =  sTime.wSecond - phbServer->m_pFtpScan->m_sysTime.wSecond;
		if(iDiffTime > 10)
		{
			phbServer->ErrMsg("FtpScan err!!!");			 
		}

		Sleep(5000);
	}	
	return 0;
}

/*创建线程执行监控*/
int ChbServer::run(CFtpScan * pFtpScan)
{
	//所需监控对象指针
	m_pFtpScan = pFtpScan;
	//线程监控
	m_pThreadInfo->hThreadHandle = CreateThread(NULL, 0, DiffTime, this, 0, &m_pThreadInfo->dwThreadID);
	
	return 0;
}

/*写错误文件*/
void ChbServer::ErrMsg(const char *pchErrorMsg)
{
	FILE *errfp;
	SYSTEMTIME sTime;
	GetLocalTime(&sTime);
	char chsysTime[30];

	sprintf(chsysTime, "%04d%02d%02d %02d:%02d:%02d", sTime.wYear, sTime.wMonth, sTime.wDay, 
		sTime.wHour, sTime.wMinute, sTime.wSecond);
	
	if((errfp = fopen(".\\errinfo.rcd", "a+")) == NULL)
	{
		#ifdef DEBUG
			cout <<"fopen "<


 被监控类:时间成员,记录生命

/*模拟待监控对象*/
#pragma once
#include 

//线程信息
typedef struct sThreadInfo
{
	HANDLE hThreadHandle;
	DWORD dwThreadID;
}T_THREADINFO;

class CFtpScan
{
public:
	CFtpScan(void);
	~CFtpScan(void);
	int run();
	int Scheduler(void);
	static DWORD WINAPI FtpScanThreadInvoke(void *pParam);
public:
	//添加时间成员wanglb6
	SYSTEMTIME m_sysTime; 
	T_THREADINFO *m_pThreadInfo;
};


 

#include "StdAfx.h"
#include "FtpScan.h"

CFtpScan::CFtpScan(void)
{
	m_pThreadInfo = new T_THREADINFO;
}

CFtpScan::~CFtpScan(void)
{
	delete m_pThreadInfo;
	m_pThreadInfo = NULL;
}
int CFtpScan::run()
{
	//待监控线程
	m_pThreadInfo->hThreadHandle = CreateThread(NULL, 0, FtpScanThreadInvoke, this, 0, &m_pThreadInfo->dwThreadID);
	return 0;
}

/**线程方法**/
DWORD CFtpScan::FtpScanThreadInvoke(void *pParam)
{
	CFtpScan *pFtpScan = (CFtpScan *)pParam;
	pFtpScan->Scheduler();

	return 0;
}

/*线程执行功能*/
int CFtpScan::Scheduler(void)
{
	while(1)
	{
		//时间刷新 添加到大循环wanglb6
		GetLocalTime(&m_sysTime);	
		Sleep(5000);
	}
}


 测试程序:

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 
using namespace std;

#include "FtpScan.h"
#include "ChbServer.h"

int _tmain(int argc, _TCHAR* argv[])
{
	CFtpScan * m_pFtpScan = new CFtpScan;
	ChbServer * m_pHbServer = new ChbServer;
	m_pFtpScan->run();

	//监控
	m_pHbServer->run(m_pFtpScan);

	system("pause");
	return 0;
}


 

你可能感兴趣的:(C++)