2016-03-25 3 views
1

私はgxuiからプログレスバーを使いたいと思っていましたが、私が期待したものは得られません。 exampleは正常に機能しますが、それを変更します。成功しませんでした。ここでは、コードは次のとおりです。私はゴルーチンを用いるので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) 
} 

、出力テキストが代替すると仮定が、すべてゴルーチンは、メインスレッドの後に印刷を行います。 私は間違って何をやっているのですか?

+0

はhttp://stackoverflow.com/questions/10095751/understanding-goroutines – user1431317

+0

@ user1431317、私はあなたが正しく私の質問 –

+0

ああを理解してわからないんだけど、申し訳ありませんが、私は見ていなかったを参照してください。 http.Getそこに。それによってメインループが生成されるはずです。 – user1431317

答えて

0

差がdocumentationで書かれたように、あなたのゴルーチンがUIルーチンを実行キューに入るということです。

// UIのゴルーチン上で実行されるFコールキュー、F 前にも帰国が呼び出されました。

UIルーチンはループを実行するので、変更を同時に処理することはできません テープProgressBar。必要な結果を得るには、別のゴルーチンでハンドリング機能を実行する必要があります。変更したコード:

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}) 
    progressBar.SetTarget(100) 
    button := theme.CreateButton() 
    button.SetText("Start") 
    t0 := time.Now() 
    button.OnClick(func(gxui.MouseEvent) { 
     go func() { 
      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() 

       driver.Call(func() { 
        progressBar.SetProgress(count * 100/N) 
       }) 

       fmt.Println(count) 
       fmt.Println(ioutil.ReadAll(resp.Body)) 
       fmt.Printf("Elapsed time: %v\n", time.Since(t0)) 

      } 
      progressBar.SetTarget(100) 
     }() 
    }) 

    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) 
} 
関連する問題