Gocui在寻呼机节目后中断

时间:2018-02-28 11:22:47

标签: go

我有一个基于gocui库的程序,它有一个带有函数的键绑定,该函数生成文本并将其发送到寻呼机的标准输入。但在关闭寻呼机之后,所有以前的gocui界面都会被破坏,但程序仍在运行。

那么我怎样才能安全地从寻呼机返回到gocui模式并继续程序?

简化示例,here

package main

import (
    "fmt"
    "log"
    "os/exec"
    "os"
    "strings"
    "github.com/jroimartin/gocui"
    "time"
    "sync"
    "bytes"
)

var (
    done = make(chan struct{})
    wg  sync.WaitGroup
)

func main() {
    g, err := gocui.NewGui(gocui.OutputNormal)
    if err != nil {
        log.Panicln(err)
    }
    defer g.Close()

    g.SetManagerFunc(layout)

    if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
        log.Panicln(err)
    }
    if err := g.SetKeybinding("", gocui.KeySpace, gocui.ModNone, pager); err != nil {
        log.Panicln(err)
    }

    wg.Add(1)
    go showTime(g)

    if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
        log.Panicln(err)
    }

    wg.Wait()
}

func layout(g *gocui.Gui) error {
    maxX, _ := g.Size()
        if v, err := g.SetView("main", -1, -1, maxX/2-1, 4); err != nil {
        if err != gocui.ErrUnknownView {
            return err
        }
        fmt.Fprintln(v, time.Now().Format("2006-01-02 15:04:05.000"))
        v.Frame = false
    }

    return nil
}

func pager(g *gocui.Gui, v *gocui.View) error {
    var buf bytes.Buffer
    for i:=0; i < 10; i++ {
        buf.WriteString(fmt.Sprintf("%d -- %s %s\n", i, "example", "text"))
    }

    cmd := exec.Command("less")
    cmd.Stdin = strings.NewReader(buf.String())
    cmd.Stdout = os.Stdout
    err := cmd.Run()

    return err
}

func showTime(g *gocui.Gui) {
    defer wg.Done()

    for {
        select {
        case <-done:
            return
        case <-time.After(1 * time.Second):
            t := time.Now()

            g.Update(func(g *gocui.Gui) error {
                v, err := g.View("main")
                if err != nil {
                    return err
                }
                v.Clear()
                fmt.Fprintln(v, t.Format("2006-01-02 15:04:05.000"))
                return nil
            })
        }
    }
}

func quit(g *gocui.Gui, v *gocui.View) error {
    return gocui.ErrQuit
}

1 个答案:

答案 0 :(得分:0)

最后的例子如下,它有其他的东西,在某些地方看起来很脏,但它一般都有用。

<userId1>