监控类:通过线程时间监控其他线程是否存活
//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;
}