Остановка вспомогательной процедуры, которая ожидает UDP-данные без замораживания основной программы в Go - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующая конструкция приемника, основанная на time.Ticker, которая вызывает метод receive() каждый заданный постоянный интервал времени, контролируемый каналами (для получения некоторых полезных данных с сервера).

Существует основная подпрограмма с логикой основного приложения c и вторая подпрограмма с логикой этого приемника c (определено в методе 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
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...