// 投递线程间消息 func (this *ThreadMsgPool) PostMsg(tid int32, a event.IEvent) bool { if !a.IsHeader() || a.IsEmpty() { return false } if tid >= jiekou.Tid_master && tid < jiekou.Tid_last { this.lock[tid].Lock() defer this.lock[tid].Unlock() header := this.header[tid] a_pre := a.GetPreTimer() a_next := a.GetNextTimer() a.SetPreTimer(a) a.SetNextTimer(a) header.GetPreTimer().SetNextTimer(a_pre) a_pre.SetPreTimer(header.GetPreTimer()) header.SetPreTimer(a_next) a_next.SetNextTimer(header) return true } return false }
// 从线程事件中弹出指定事件, 只能操作本线程事件 func (this *Thread) PopTimer(e event.IEvent) { if !e.IsHeader() { e.GetPreTimer().SetNextTimer(e.GetNextTimer()) e.GetNextTimer().SetPreTimer(e.GetPreTimer()) e.SetNextTimer(nil) e.SetPreTimer(nil) } }
// 运行一条定时器事件链表, 每次都执行第一个事件, 直到链表为空 func (this *Thread) runExec(header event.IEvent) { for { // 每次得到链表第一个事件(非) evt := header.GetNextTimer() if evt.IsHeader() { break } // 执行事件, 返回true, 删除这个事件, 返回false表示用户自己处理 if evt.Exec(this.self) { this.RemoveEvent(evt) } else if header.GetNextTimer() == evt { // 防止使用者没有删除使用过的事件, 造成死循环, 该事件, 用户要么重新投递到其他链表, 要么删除 this.RemoveEvent(evt) } } }