监控类:通过线程时间监控其他线程是否存活
//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; }
原文:http://blog.csdn.net/leeboy_wang/article/details/19402245