Esempio n. 1
0
// 投递线程间消息
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
}
Esempio n. 2
0
// 从线程事件中弹出指定事件, 只能操作本线程事件
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)
	}
}
Esempio n. 3
0
// 运行一条定时器事件链表, 每次都执行第一个事件, 直到链表为空
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)
		}
	}
}