teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

解決例追記

2018/11/12 10:09

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -6,4 +6,73 @@
6
6
  GUIではメインスレッド(メインゴルーチン)でないとイベントループが回らないという問題は常について回ります。
7
7
 
8
8
  walkはSynchronizeメソッドに関数を渡すとその処理がメインゴルーチンで動く仕掛けを持っています。
9
- 上記の解決例を参考に作り直してみましょう。
9
+ 上記の解決例を参考に作り直してみましょう。
10
+
11
+ 解決例(追記):
12
+
13
+ ```go
14
+ package main
15
+
16
+ import (
17
+ "fmt"
18
+ "log"
19
+ "time"
20
+
21
+ "github.com/lxn/walk"
22
+ . "github.com/lxn/walk/declarative"
23
+ )
24
+
25
+ func main() {
26
+ fmt.Println("Start!")
27
+ go func() {
28
+ // PCの情報を取得する
29
+ getInfo()
30
+ fmt.Println("PC情報の取得に成功しました。")
31
+ }()
32
+ showWindow() // ウインドウが閉じるまでブロックします(閉じるまでreturnしない)
33
+ }
34
+
35
+ // 受け渡し用構造体
36
+ type MyLoadWindow struct {
37
+ *walk.MainWindow
38
+ progressBar *walk.ProgressBar
39
+ }
40
+
41
+ var mw = &MyLoadWindow{}
42
+
43
+ func showWindow() {
44
+
45
+ // 画面サイズ取得
46
+ sizeX := 300
47
+ sizeY := 100
48
+
49
+ // 画面情報設定
50
+ MW := MainWindow{
51
+ AssignTo: &mw.MainWindow,
52
+ Title: "待機中",
53
+ Size: Size{
54
+ sizeX,
55
+ sizeY},
56
+ Font: Font{PointSize: 12},
57
+ Layout: VBox{},
58
+
59
+ Children: []Widget{
60
+
61
+ ProgressBar{
62
+ AssignTo: &mw.progressBar,
63
+ MarqueeMode: true,
64
+ },
65
+ },
66
+ }
67
+
68
+ if _, err := MW.Run(); err != nil {
69
+ log.Fatal(err) // エラーはあれば表示しましょう
70
+ }
71
+ }
72
+
73
+ func getInfo() {
74
+ time.Sleep(10 * time.Second)
75
+ fmt.Println("get Info")
76
+ mw.MainWindow.Synchronize(func(){mw.MainWindow.Close()}) // メインgoroutineからウインドウのクローズを呼ぶ
77
+ }
78
+ ```