为什么不改变 gxui 中进度条的映射?

我想使用gxui的进度条,但没有达到我的预期。该示例正常工作,但更改它我没有成功。这是代码:


package main


import (

    "fmt"

    "io/ioutil"

    "log"

    "net/http"

    "time"


    "github.com/google/gxui"

    "github.com/google/gxui/drivers/gl"

    "github.com/google/gxui/math"

    "github.com/google/gxui/samples/flags"

)


func appMain(driver gxui.Driver) {

    theme := flags.CreateTheme(driver)


    layout := theme.CreateLinearLayout()

    layout.SetHorizontalAlignment(gxui.AlignCenter)


    progressBar := theme.CreateProgressBar()

    progressBar.SetDesiredSize(math.Size{W: 480, H: 60})


    button := theme.CreateButton()

    button.SetText("Start")

    t0 := time.Now()

    button.OnClick(func(gxui.MouseEvent) {

        progressBar.SetTarget(100)

        N := 100


        for count := 0; count < N; count++ {

            resp, err := http.Get("http://example.com")

            if err != nil {

                log.Fatal(err)

            }

            defer resp.Body.Close()


            if count%10 == 0 {


                go func() {

                    driver.Call(func() {

                        fmt.Println("Tuk")

                        progressBar.SetProgress(count * 100 / N)

                    })

                }()

                fmt.Println(count)

                fmt.Println(ioutil.ReadAll(resp.Body))

                fmt.Printf("Elapsed time: %v\n", time.Since(t0))

            }

        }

        progressBar.SetProgress(50)

    })


    layout.AddChild(button)

    layout.AddChild(progressBar)


    window := theme.CreateWindow(500, 100, "Test")

    window.SetScale(flags.DefaultScaleFactor)

    window.AddChild(layout)

    window.OnClose(driver.Terminate)

}


func main() {

    gl.StartDriver(appMain)

}

由于我使用了 goroutine,假设输出文本会交替,但所有 goroutine 仅在主线程之后执行打印。我做错了什么以及如何解决?


白衣非少年
浏览 155回答 1
1回答

狐的传说

不同之处在于您的 goroutine 进入执行 UI 例程的队列,如文档中所述:// 调用队列 f 在 UI go-routine 上运行,在 f 可能被调用之前返回。UI-routine 执行一个循环,所以不能同时处理改变磁带的ProgressBar。为了得到想要的结果,需要在单独的 goroutine 中运行处理函数。修改后的代码:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "io/ioutil"&nbsp; &nbsp; "log"&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "time"&nbsp; &nbsp; "github.com/google/gxui"&nbsp; &nbsp; "github.com/google/gxui/drivers/gl"&nbsp; &nbsp; "github.com/google/gxui/math"&nbsp; &nbsp; "github.com/google/gxui/samples/flags")func appMain(driver gxui.Driver) {&nbsp; &nbsp; theme := flags.CreateTheme(driver)&nbsp; &nbsp; layout := theme.CreateLinearLayout()&nbsp; &nbsp; layout.SetHorizontalAlignment(gxui.AlignCenter)&nbsp; &nbsp; progressBar := theme.CreateProgressBar()&nbsp; &nbsp; progressBar.SetDesiredSize(math.Size{W: 480, H: 60})&nbsp; &nbsp; progressBar.SetTarget(100)&nbsp; &nbsp; button := theme.CreateButton()&nbsp; &nbsp; button.SetText("Start")&nbsp; &nbsp; t0 := time.Now()&nbsp; &nbsp; button.OnClick(func(gxui.MouseEvent) {&nbsp; &nbsp; &nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; N := 100&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for count := 0; count < N; count++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resp, err := http.Get("http://example.com")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; defer resp.Body.Close()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; driver.Call(func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; progressBar.SetProgress(count * 100 / N)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(count)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(ioutil.ReadAll(resp.Body))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Elapsed time: %v\n", time.Since(t0))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; progressBar.SetTarget(100)&nbsp; &nbsp; &nbsp; &nbsp; }()&nbsp; &nbsp; })&nbsp; &nbsp; layout.AddChild(button)&nbsp; &nbsp; layout.AddChild(progressBar)&nbsp; &nbsp; window := theme.CreateWindow(500, 100, "Test")&nbsp; &nbsp; window.SetScale(flags.DefaultScaleFactor)&nbsp; &nbsp; window.AddChild(layout)&nbsp; &nbsp; window.OnClose(driver.Terminate)}func main() {&nbsp; &nbsp; gl.StartDriver(appMain)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go