質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

485閲覧

情報取得中のロード画面を作成したい

moshi

総合スコア90

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

1グッド

0クリップ

投稿2018/11/07 06:57

編集2018/11/12 05:02

前提・実現したいこと

情報を読み込んでいることを表示する画面を作成したいです。
使用言語はgolangでGUIを表示するライブラリはwalkを使用しています。
GoでGUIを表示する

試したこと

まず初めに、ロード画面のGUIを表示する

showWindow()

という関数を作成しました。
これはプログレスバーを表示するだけの簡単なものになっています。

次に、コンピュータの情報を取得する

getInfo()

という関数を作成しました。

これら2つはそれぞれ期待通りに動作するのを確認できています。

最後に、情報を読み込んでいる間はロード画面を表示する、ということがしたかったので
Goで並列処理
を参考に以下のコードを作成しました。

import ( "log" "time" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) func main() { isFin1 := make(chan bool) isFin2 := make(chan bool) fmt.Println("Start!") go func() { // ロード画面を表示する showWindow() isFin1 <- true }() go func() {      // PCの情報を取得する getInfo() isFin2 <- true }() // 情報を取得するのを待つ <-isFin1 <-isFin2 fmt.Println("PC情報の取得に成功しました。") } // 受け渡し用構造体 type MyLoadWindow struct { *walk.MainWindow progressBar *walk.ProgressBar } func showWindow() { mw := &MyLoadWindow{} // 画面サイズ取得 sizeX := 300 sizeY := 100 // 画面情報設定 MW := MainWindow{ AssignTo: &mw.MainWindow, Title: "待機中", Size: Size{ sizeX, sizeY}, Font: Font{PointSize: 12}, Layout: VBox{}, Children: []Widget{ ProgressBar{ AssignTo: &mw.progressBar, MarqueeMode: true, }, }, } if _, err := MW.Run(); err != nil { return } } func getInfo() { fmt.Println("get Info") }

発生している問題・エラーメッセージ

上記のコードを実行すると
PC情報の取得関数は動作しているが、ロード画面が表示されない ように見えるという問題が発生しました。
デバッガで実行するとshowWindow()のところも通っているように見えるのですが
単体で実行したときに表示されたプログレスバーは表示されませんでした。

並列処理というものを初めてしたのできっとそこに問題があると思うのですが
どなたか何が悪いかわかる方がいたら教えていただけないでしょうか。

※追記
よく考えてみれば<-isFin2になったらshowWindow()を終了するのような処理にするべきなのかなと思いましたが
そこをどのように実現すればいいのかが思いつかなかったです…

補足情報(FW/ツールのバージョンなど)

Windows
Golang

torisan👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ここに同様の悩みと解決例があります。

https://github.com/lxn/walk/issues/297

GUIではメインスレッド(メインゴルーチン)でないとイベントループが回らないという問題は常について回ります。

walkはSynchronizeメソッドに関数を渡すとその処理がメインゴルーチンで動く仕掛けを持っています。
上記の解決例を参考に作り直してみましょう。

解決例(追記):

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/lxn/walk" 9 . "github.com/lxn/walk/declarative" 10) 11 12func main() { 13 fmt.Println("Start!") 14 go func() { 15 // PCの情報を取得する 16 getInfo() 17 fmt.Println("PC情報の取得に成功しました。") 18 }() 19 showWindow() // ウインドウが閉じるまでブロックします(閉じるまでreturnしない) 20} 21 22// 受け渡し用構造体 23type MyLoadWindow struct { 24 *walk.MainWindow 25 progressBar *walk.ProgressBar 26} 27 28var mw = &MyLoadWindow{} 29 30func showWindow() { 31 32 // 画面サイズ取得 33 sizeX := 300 34 sizeY := 100 35 36 // 画面情報設定 37 MW := MainWindow{ 38 AssignTo: &mw.MainWindow, 39 Title: "待機中", 40 Size: Size{ 41 sizeX, 42 sizeY}, 43 Font: Font{PointSize: 12}, 44 Layout: VBox{}, 45 46 Children: []Widget{ 47 48 ProgressBar{ 49 AssignTo: &mw.progressBar, 50 MarqueeMode: true, 51 }, 52 }, 53 } 54 55 if _, err := MW.Run(); err != nil { 56 log.Fatal(err) // エラーはあれば表示しましょう 57 } 58} 59 60func getInfo() { 61 time.Sleep(10 * time.Second) 62 fmt.Println("get Info") 63 mw.MainWindow.Synchronize(func(){mw.MainWindow.Close()}) // メインgoroutineからウインドウのクローズを呼ぶ 64}

投稿2018/11/07 22:05

編集2018/11/12 10:09
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moshi

2018/11/08 01:35

すみません、少し難しかったので確認なのですが、 作り直す必要があるのはGUIを表示するshowWindow()の中身ではなく showWindow()を呼び出すところを修正すればいいのですよね?
nobonobo

2018/11/09 05:26

動くコードを示されていないのでなんとも回答できません。
moshi

2018/11/09 05:40

ロード画面のソースコードを追記しました。
nobonobo

2018/11/12 04:59

MyLoadWindowの定義がなくて動きません。
moshi

2018/11/12 05:03

たびたびすみません。MyLoadWindowの定義を追記しました。
moshi

2018/11/13 01:14

回答ありがとうございました! 期待通りの動きがようやくできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問