为什么我的Go事件每两个事件只处理一次?



我有以下settings_manager.go

package main
type Settings struct {
globalTrackingDisabled      bool
textTracking                bool
imageTracking               bool
debug                       bool
Event                       chan string
EventTextTracking           string
EventImageTracking          string
EventGlobalTrackingDisabled string
EventDebugToggled           string
}
type DefaultValues struct {
GlobalTrackingDisabled bool
TextTracking           bool
ImageTracking          bool
DebugEnabled           bool
}
func NewSettings(defaults DefaultValues) *Settings {
return &Settings{
globalTrackingDisabled:      defaults.GlobalTrackingDisabled,
textTracking:                defaults.TextTracking,
imageTracking:               defaults.ImageTracking,
debug:                       defaults.DebugEnabled,
Event:                       make(chan string, 1),
EventTextTracking:           "textTracking",
EventImageTracking:          "imageTracking",
EventGlobalTrackingDisabled: "globalTrackingDisabled",
EventDebugToggled:           "debugToggled",
}
}
// Get the current value of textTracking
func (s *Settings) TextTrackingEnabled() bool {
return s.textTracking
}
// Get the current value of imageTracking
func (s *Settings) ImageTrackingEnabled() bool {
return s.imageTracking
}
// Get the current value of globalTrackingDisabled
func (s *Settings) GlobalTrackingDisabled() bool {
return s.globalTrackingDisabled
}
// Get inverse of TextTrackingEnabled()
func (s *Settings) TextTrackingDisabled() bool {
return !s.TextTrackingEnabled()
}
// Get inverse of ImageTrackingEnabled()
func (s *Settings) ImageTrackingDisabled() bool {
return !s.ImageTrackingEnabled()
}
// Get the inverse of GlobalTrackingDisabled()
func (s *Settings) GlobalTrackingEnabled() bool {
return !s.GlobalTrackingDisabled()
}
// Get the inverse of GlobalTrackingDisabled()
func (s *Settings) Debug() bool {
return s.debug
}
// SetGlobalTracking sets the globalTrackingDisabled property and fires an event
func (s *Settings) SetGlobalTracking(value bool) {
s.textTracking = value
s.Event <- s.EventGlobalTrackingDisabled
}
// SetTextTracking sets the textTracking property and fires an event
func (s *Settings) SetTextTracking(value bool) {
Debug("setter to ", value, s.EventTextTracking)
s.textTracking = value
s.Event <- s.EventTextTracking
Debug("Sent event %sn", s.EventTextTracking)
}
// SetImageTracking sets the imageTracking property and fires an event
func (s *Settings) SetImageTracking(value bool) {
s.imageTracking = value
s.Event <- s.EventImageTracking
}
// SetDebug sets the debug property and fires an event
func (s *Settings) SetDebug(value bool) {
s.debug = value
s.Event <- s.EventDebugToggled
}
// DebugDisable sets the debug property to false and fires an event
func (s *Settings) DebugDisable() {
s.debug = false
s.Event <- s.EventDebugToggled
}
// DebugEnable sets the debug property to true and fires an event
func (s *Settings) DebugEnable() {
s.debug = true
s.Event <- s.EventDebugToggled
}

我有一个系统菜单项,我想在点击时切换TextTracking设置。

// Click action
go func() {
for {
select {
case <-captureTextMenuItem.ClickedCh:
Debug("Menu item clicked. New Value should be ", !captureTextMenuItem.Checked())
if captureTextMenuItem.Checked() {
settings.SetTextTracking(false)
} else {
settings.SetTextTracking(true)
}
//settings.SetTextTracking(!settings.TextTrackingEnabled())
//Debug(settings.TextTrackingEnabled())
}
}
}()

我是这样处理这个事件的:

// event handler

go func() {
for {
select {
case event := <-settings.Event:
Debug("Received Event", event)
switch event {
case settings.EventTextTracking:
Debug("Ready to do something with the text event")
if settings.TextTrackingEnabled() {
Debug("Enabling checkmark")
captureTextMenuItem.Check()
} else {
Debug("Removing checkmark")
captureTextMenuItem.Uncheck()
}
case settings.EventGlobalTrackingDisabled:
Debug("Ready to do something with the global tracker event")
if settings.GlobalTrackingEnabled() {
Debug("enabling global tracker")
captureTextMenuItem.Enable()
} else {
Debug("disabling global tracker")
captureTextMenuItem.Disabled()
}
default:
fmt.Println("received unknown event:", event)
}
}
}
}()

我遇到的问题是每次我单击菜单项时,我都可以看到SetTextTracking被触发,但是,我的事件处理程序每两次触发事件只调用一次。

因为您使用了缓冲通道。你向信道发送一个有效载荷,什么也没发生。当您发送另一个有效负载时,缓冲区将被刷新,接收端将开始运行。

尝试使用未缓冲的通道。

最新更新