У меня есть следующая конструкция приемника, основанная на 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
}
}