diff options
Diffstat (limited to 'debugGochan.go')
| -rw-r--r-- | debugGochan.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/debugGochan.go b/debugGochan.go new file mode 100644 index 0000000..3183bdb --- /dev/null +++ b/debugGochan.go @@ -0,0 +1,107 @@ +// https://www.digitalocean.com/community/tutorials/how-to-run-multiple-functions-concurrently-in-go +// who came up with the idea of making community tutorials. that was a good idea! + +package gui + +import ( + "fmt" + "sync" +) + +var debugWG *sync.WaitGroup +var debugNumberChan chan int + +func (n *Node) debugGoChannels(makeWindow bool) { + var w, g *Node + + // Either: + // make a new window + // make a new tab in the existing window + if (makeWindow) { + Config.Title = "Debug GO Channels" + Config.Width = 300 + Config.Height = 400 + w = NewWindow() + w.Custom = w.StandardClose + } else { + w = n.NewTab("Chan") + } + w.Dump() + + g = w.NewGroup("Channel stuff") + + // var debugWG sync.WaitGroup + g.NewButton("init()", func () { + if (debugNumberChan == nil) { + log("making debugNumberChan channel") + debugNumberChan = make(chan int) + } else { + log("debugNumberChan already made") + } + debugWG = new(sync.WaitGroup) + }) + g.NewButton("go printInt(x) (read x values off the channel)", func () { + debugWG.Add(1) + go printInt(2, "routine1") + debugWG.Add(1) + go printInt(2, "routine2") + }) + g.NewButton("sendNumber(2) (chan <- 2, 4)", func () { + debugWG.Add(1) + debugWG.Add(1) + go sendNumber(2) + go sendNumber(4) + }) + g.NewButton("sendNumber(1) (chan <- 7)", func () { + debugWG.Add(1) + go sendNumber(7) + }) + g.NewButton("send 4 numbers (chan <- int)", func () { + log("generateNumbers(4)") + go generateNumbers(4) + }) + g.NewButton("debugWG.Done()", func () { + log("ran debugWG.Done()") + debugWG.Done() + }) + g.NewButton("close chan", func () { + close(debugNumberChan) + }) + g.NewButton("print", func () { + log("waitgroup counter is ?") + }) +} +func sendNumber(i int) { + log("START debugNumberChan <-", i, " (sending", i, "to channel)") + debugNumberChan <- i + debugWG.Wait() + log("END debugNumberChan sendNumber() done", i) +} + +func generateNumbers(total int) { + fmt.Printf("START generateNumbers()\n") + for idx := 1; idx <= total; idx++ { + log("ran debugNumberChan <= idx where idx =", idx) + fmt.Printf("S generateNumbers() sending %d to channel\n", idx) + debugNumberChan <- idx + // res, err := (<-r)() + fmt.Printf("E generateNumbers() sending %d to channel\n", idx) + } + debugWG.Wait() + fmt.Printf("END generateNumbers()\n") +} + +// i equals the number of times to read values from the channel +func printInt(i int, name string) { + tmp := 1 + log("START printInt", name, "read debugNumberChan()") + for num := range debugNumberChan { + log("printInt()",name, "read", num, "from channel") + debugWG.Done() + if (tmp == i) { + return + } + tmp += 1 + } + fmt.Printf("END printInt()", name, "read debugNumberChan\n") +} |
