public void kmevent_settimer(KMEVENT kme, UInt32 curid, UInt32 time) { kmevent_itemunlist(kme, curid); /* 取り外し */ kme.item[curid].count = time != 0 ? kme.item[0].count + time : 0; if (kme.item[curid].count != 0) { kmevent_iteminsert(kme, curid); /* ソート */ } }
/* 指定サイクル分実行 */ public void kmevent_process(KMEVENT kme, UInt32 cycles) { UInt32 id; UInt32 nextcount; kme.item[0].count += cycles; if (kme.item[0].next == 0) { /* リストが空なら終わり */ kme.item[0].count = 0; return; } nextcount = kme.item[kme.item[0].next].count; while (nextcount != 0 && kme.item[0].count >= nextcount) { /* イベント発生済フラグのリセット */ for (id = kme.item[0].next; id != 0; id = kme.item[id].next) { kme.item[id].sysflag &= 0xfc;// ~((byte)KMEVENT_FLAG.KMEVENT_FLAG_BREAKED + (byte)KMEVENT_FLAG.KMEVENT_FLAG_DISPATCHED); } /* nextcount分進行 */ kme.item[0].count -= nextcount; for (id = kme.item[0].next; id != 0; id = kme.item[id].next) { if (kme.item[id].count == 0) { continue; } kme.item[id].count -= nextcount; if (kme.item[id].count != 0) { continue; } /* イベント発生フラグのセット */ kme.item[id].sysflag |= (byte)KMEVENT_FLAG.KMEVENT_FLAG_BREAKED; } for (id = kme.item[0].next; id != 0; id = kme.item[id].next) { /* イベント発生済フラグの確認 */ if ((kme.item[id].sysflag & (byte)KMEVENT_FLAG.KMEVENT_FLAG_DISPATCHED) != 0) { continue; } kme.item[id].sysflag |= (byte)KMEVENT_FLAG.KMEVENT_FLAG_DISPATCHED; /* イベント発生フラグの確認 */ if ((kme.item[id].sysflag & (byte)KMEVENT_FLAG.KMEVENT_FLAG_BREAKED) == 0) { continue; } /* 対象イベント起動 */ kme.item[id].proc(kme, id, kme.item[id].user); /* 先頭から再走査 */ id = 0; } nextcount = kme.item[kme.item[0].next].count; } }
/* リストから取り外す */ private void kmevent_itemunlist(KMEVENT kme, UInt32 curid) { KMEVENT_ITEM cur, next, prev; cur = kme.item[curid]; next = kme.item[cur.next]; prev = kme.item[cur.prev]; next.prev = cur.prev; prev.next = cur.next; }
public void kmevent_init(KMEVENT kme) { UInt32 id; for (id = 0; id <= KMEVENT_ITEM_MAX; id++) { kme.item[id] = new KMEVENT_ITEM(); kme.item[id].sysflag = 0; } kmevent_reset(kme); }
/* リストの指定位置(baseid)の直前に挿入 */ private void kmevent_itemlist(KMEVENT kme, UInt32 curid, UInt32 baseid) { KMEVENT_ITEM cur, next, prev; cur = kme.item[curid]; next = kme.item[baseid]; prev = kme.item[next.prev]; cur.next = (byte)baseid; cur.prev = next.prev; prev.next = (byte)curid; next.prev = (byte)curid; }
private void kmevent_reset(KMEVENT kme) { UInt32 id; kme.item[0].count = 0; for (id = 0; id <= KMEVENT_ITEM_MAX; id++) { kme.item[id].sysflag &= (byte)~KMEVENT_FLAG.KMEVENT_FLAG_ALLOCED; kme.item[id].count = 0; kme.item[id].next = (byte)id; kme.item[id].prev = (byte)id; } }
public UInt32 kmevent_alloc(KMEVENT kme) { UInt32 id; for (id = 1; id <= KMEVENT_ITEM_MAX; id++) { if (kme.item[id].sysflag == 0) { kme.item[id].sysflag = (byte)KMEVENT_FLAG.KMEVENT_FLAG_ALLOCED; return(id); } } return(0); }
public UInt32 kmevent_gettimer(KMEVENT kme, UInt32 curid, ref UInt32 time) { UInt32 nextcount; nextcount = kme.item[curid != 0 ? curid : kme.item[0].next].count; if (nextcount == 0) { return(0); } nextcount -= kme.item[0].count; if (time != 0) { time = nextcount; } return(1); }
/* ソート済リストに挿入 */ private void kmevent_iteminsert(KMEVENT kme, UInt32 curid) { UInt32 baseid; for (baseid = kme.item[0].next; baseid != 0; baseid = kme.item[baseid].next) { if (kme.item[baseid].count != 0) { if (kme.item[baseid].count > kme.item[curid].count) { break; } } } kmevent_itemlist(kme, curid, baseid); }
//public void kmevent_setevent(KMEVENT kme, UInt32 curid, dlgProc proc, object user) public void kmevent_setevent(KMEVENT kme, UInt32 curid, dlgProc proc, m_hes.HESHES user) { kme.item[curid].proc = proc; kme.item[curid].user = user; }
public void kmevent_free(KMEVENT kme, UInt32 curid) { kmevent_itemunlist(kme, curid); kme.item[curid].sysflag = 0; }