2009 March 6th Friday (三月 六日 金曜日)

来源:互联网 发布:ntfs for mac 破解版 编辑:程序博客网 时间:2024/03/28 22:44

   There is a demo of event queue implement.

//evt.cpp
#include <iostream>

using namespace std;

#define SIG_ABRT   1
#define SIG_STOP   2
#define SIG_KILL   3
#define SIG_CHLD   4

#define SIG_MAX    5

struct _EvtEntry {
int event;
struct _EvtEntry *next;
};

typedef struct _EvtEntry EvtEntry;

class EvtQueue {
private:
int event_cnt;  // the count events.
EvtEntry *head;
EvtEntry *tail;

public:
EvtQueue();
~EvtQueue();

void AppendEvt(int evt);
void AddEvt(int evt);
int RemoveEvt();
int getEvtCnt();
};

EvtQueue::EvtQueue(){
event_cnt = 0;
head = NULL;
tail = NULL;
}

EvtQueue::~EvtQueue() {
if (event_cnt > 0) {
for (int i = 0; i < event_cnt; i++)
RemoveEvt();
head = NULL;
tail = NULL;
event_cnt = 0;
}
}

void EvtQueue::AppendEvt(int evt) {
EvtEntry *pEvt = new EvtEntry();

if (pEvt) {
// initialization
pEvt->event = evt;
pEvt->next = NULL;

// append to the event queue

// empty queue
if (!head && !tail) {
head = pEvt;
tail = pEvt;
}
else
tail->next = pEvt;

event_cnt++;
}
}

void EvtQueue::AddEvt(int evt) {

// search the event if exist
for (EvtEntry *p = head; p; p = p->next) {
if (p->event = evt)
break;
}

// no found
if (!p) {
EvtEntry *pEvt = new EvtEntry();

if (pEvt) {
// initialization
pEvt->event = evt;
pEvt->next = NULL;

// append to the event queue

// empty queue
if (!head && !tail) {
head = pEvt;
tail = pEvt;
}
else
tail->next = pEvt;

event_cnt++;
}
}
}

int EvtQueue::RemoveEvt() {
EvtEntry *pEvt = NULL;

// get an event
pEvt = head;
head = head->next;
event_cnt--;

int evt = pEvt->event;
delete pEvt;

return evt;
}

int EvtQueue::getEvtCnt() {
return event_cnt;
}

char* sig_msg(int evt) {
static char *msg[SIG_MAX] = {
"signal abort",
"signal stop",
"signal kill",
"signal child",
"unknown signal"
};

if ((evt <= 0) || (evt >= SIG_MAX))
return msg[SIG_MAX];
else
return msg[evt];
}

原创粉丝点击