46 lines
946 B
Go
46 lines
946 B
Go
|
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
||
|
|
||
|
package worker;
|
||
|
|
||
|
import (
|
||
|
"feudal/message"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// A ticker thread that implements the runner interface and generates tick events for the given context
|
||
|
|
||
|
type Clock struct {
|
||
|
ticker *time.Ticker
|
||
|
quit chan bool
|
||
|
stopped chan bool
|
||
|
}
|
||
|
|
||
|
func NewClock(interval int) *Clock {
|
||
|
return &Clock{ ticker: time.NewTicker(time.Duration(interval) * time.Millisecond), quit: make(chan bool), stopped: make(chan bool) }
|
||
|
}
|
||
|
|
||
|
func (l *Clock) Start(d Dispatcher, c Context) {
|
||
|
go func() {
|
||
|
for {
|
||
|
select {
|
||
|
case tick := <- l.ticker.C:
|
||
|
d.Dispatch(message.New(&message.ClockTick{ T:tick }, c), c)
|
||
|
case <- l.quit:
|
||
|
l.ticker.Stop()
|
||
|
if v := c.Division(); v != nil {
|
||
|
v.Disolve()
|
||
|
}
|
||
|
close(l.stopped)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
func (l *Clock) Stop() {
|
||
|
close(l.quit)
|
||
|
select {
|
||
|
case <- l.stopped:
|
||
|
}
|
||
|
}
|