Files
mir_server/Gateway/common/utils/watch_thread.h

103 lines
1.8 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _WATCH_THREAD_H_
#define _WATCH_THREAD_H_
using namespace tick64;
using namespace container;
using namespace lock;
typedef void (*BlockFunc)(void*);
class WatchThread
{
// <20><><EFBFBD>Կ<EFBFBD><D4BF>ǼӸ<C7BC><D3B8><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct WatchData
{
int id_;
int64_t last_t_;
int timeout_;
BlockFunc func_;
void* params_;
WatchData() : id_(0), last_t_(0), timeout_(0), func_(NULL), params_(NULL)
{
}
};
enum WatchMsg
{
wmAddWatch,
wmReport,
wmRemove,
};
typedef struct
{
unsigned int uMsg; //<2F><>Ϣ<EFBFBD><CFA2>
size_t uParam1;//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>1
size_t uParam2;//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>2
BlockFunc func;
void* params;
}InterMsg;
public:
WatchThread();
virtual ~WatchThread();
bool Startup();
void Stop();
#ifdef _MSC_VER
unsigned long GetThreadId()
#else
pthread_t GetThreadId()
#endif
{
return thread_id_;
}
void AddWatch(int id, int timeout, BlockFunc func = NULL, void* params = NULL)
{
PostMsg(wmAddWatch, id, timeout, func, params);
}
void RemoveWatch(int id)
{
PostMsg(wmRemove, id, 0, NULL, NULL);
}
void Report(int id)
{
PostMsg(wmReport, id, 0, NULL, NULL);
}
protected:
virtual void OnWorkThreadStart();
virtual void OnWorkThreadStop();
protected:
void SingleRun();
void ProcessSysMsg();
void OnRecvSysMsg(UINT msg, size_t p1, size_t p2, BlockFunc func, void* params);
void PostMsg(UINT uMsg, size_t para1, size_t para2, BlockFunc func, void* params);
WatchData* Find(int id);
private:
#ifdef _MSC_VER
static void STDCALL Work_R(WatchThread* ptr);
#else
static void* Work_R(void* ptr);
#endif
private:
#ifdef _MSC_VER
HANDLE handle_; //<2F><><EFBFBD><EFBFBD><EFBFBD>߳̾<DFB3><CCBE><EFBFBD>
unsigned long thread_id_; //<2F>߳<EFBFBD>ID
#else
pthread_t thread_id_;
#endif
bool stoped_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ϊֹͣ
bool exit_;
QueueList<InterMsg> msg_list_; //<2F>ڲ<EFBFBD><DAB2><EFBFBD>Ϣ<EFBFBD>б<EFBFBD>
Mutex msg_lock_; //<2F>ڲ<EFBFBD><DAB2><EFBFBD>Ϣ<EFBFBD>б<EFBFBD><D0B1><EFBFBD>
Vector<WatchData> list_;
};
#endif