多线程生命监控

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

//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 "<<PARAMERRFILE<<" Error"<<endl;
		#endif
		return;
	}
	fprintf(errfp, "%s\t%s\n", chsysTime, pchErrorMsg);
	fclose(errfp);
	return;
}


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

/*模拟待监控对象*/
#pragma once
#include <Windows.h>

//线程信息
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 <windows.h>
#include <iostream>
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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值