停止等待UDP数据的助手goroutine,而无需冻结Go中的主goroutine

我有以下基于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
    }
}

lxyyxl001 回答:停止等待UDP数据的助手goroutine,而无需冻结Go中的主goroutine

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2539126.html

大家都在问