我有以下基于time.Ticker
的接收器构造,该接收器构造在每个给定的恒定时间间隔(由通道控制)中调用方法receive()
(从服务器中获取一些有用的数据)。
有一个具有主应用程序逻辑的主例程和具有此接收器逻辑的第二例程(在Start()
方法中定义)。并且存在以下问题:当我试图从主例程停止接收器例程(使用定义的Stop()
方法)而receive()
等待来自UDP连接的数据时,主例程似乎冻结了(我有那里有一些GUI,并且不允许进行干预)。我实际上不明白为什么会这样,因为通道应该允许我与该接收器例程进行交互。我需要在给定的时间点停止此接收器,即使它仍在等待UDP数据,并且主例程仍应能够工作。我会很感谢您的解释和一些想法,如何在不冻结主要例程的情况下停止此接收器。
问候
type RtpReceiver struct {
Ticker *time.Ticker
Interval time.Duration
doneCheck chan bool
started bool
// some othe fields
}
func NewRtpReceiver() *RtpReceiver {
// some logic
return &RtpReceiver{
doneCheck: make(chan bool),started: false,}
}
func (receiver *RtpReceiver) receive() {
_,_,_ = (*receiver.UdpCon).ReadFrom(receiver.buffer)
// some logic
}
func (receiver *RtpReceiver) Start() {
receiver.started = true
receiver.Ticker = time.NewTicker(receiver.Interval)
go func() {
for {
select {
case <-receiver.doneCheck:
return
case <-receiver.Ticker.C:
receiver.receive()
}
}
}()
}
func (receiver *RtpReceiver) Stop() {
if receiver.started {
receiver.doneCheck <- true
receiver.Ticker.Stop()
receiver.started = false
}
}