全部代码


package main

import (
 "time"

 "fyne.io/fyne/v2"
 "fyne.io/fyne/v2/app"
 "fyne.io/fyne/v2/container"
 "fyne.io/fyne/v2/dialog"
 "fyne.io/fyne/v2/widget"
)

func main() {
 // 创建一个 Fyne 应用
 a := app.New()
 // 创建一个窗口
 customFont := fyne.NewStaticResource("NotoSansHans.ttf", loadFont("NotoSansHans-Regular.ttf"))
 a.Settings().SetTheme(&myTheme{font: customFont})

 win := a.NewWindow("高端检测器")

 // 创建一个按钮
 btn := widget.NewButton("检测是否开机", func() {
  // 创建一个进度条
  progress := widget.NewProgressBarInfinite()
  progressContainer := container.NewVBox(progress)

  // 显示加载动画
  loadingDialog := dialog.NewCustom("正在检测...", "取消", progressContainer, win)
  loadingDialog.Show()

  // 模拟加载时间
go func(){

 time.Sleep(10 * time.Second) // 10 秒模拟加载时间

 // 关闭加载动画并弹出结果窗口
 loadingDialog.Hide()
 dialog.ShowInformation("结果", "电脑是开机的", win)
}()

 })

 // 设置窗口内容
 win.SetContent(container.NewVBox(btn))
 win.Resize(fyne.Size{Width: 400, Height: 200})
 win.CenterOnScreen()
 win.ShowAndRun()
}

Go goroutine 简单概念

Goroutine 是 Go 语言中的一种轻量级线程, 由 Go 运行时管理。Goroutine 使得并发编程变得更加简单和高效,可以通过关键字 go 启动。

当然, 每一个并发执行的活动称为goroutine。当一个程序启动时, 只有一个goroutine来调用main函数, 称之为主goroutine。

特点

  1. 轻量级

    • Goroutine 非常轻量级, 可以在同一个程序中启动成千上万个 Goroutine, 而不会造成过多的内存开销。
  2. 易于使用

    • 只需在函数调用前加上 go 关键字, 即可启动一个新的 Goroutine。
  3. 并发执行

    • Goroutine 可以并发执行, 不同的 Goroutine 之间可以独立运行, 互不干扰。
  4. 调度器管理

    • Go 运行时会自动管理 Goroutine 的调度, 充分利用多核处理器的优势。

Goroutine 示例

以下是一个简单的 Goroutine 示例:

package main

import (
 "fmt"
 "time"
)

func sayHello() {
 for i := 0; i < 5; i++ {
  fmt.Println("Hello")
  time.Sleep(1 * time.Second)
 }
}

func main() {
 go sayHello() // 启动一个新的 Goroutine 执行 sayHello 函数

 // 主 Goroutine 继续执行其他代码
 for i := 0; i < 5; i++ {
  fmt.Println("World")
  time.Sleep(1 * time.Second)
 }

 // 等待 sayHello 函数执行完成
 time.Sleep(6 * time.Second)
}

输出情况:

由于 sayHello 函数在一个新的 goroutine 中执行, 而 main 函数继续执行, 两个函数的输出将会交错在一起。具体的输出可能会有所不同, 有可能是如下面这样

  World
Hello
World
Hello
...
  

而Up主的案例是这样。

  World
Hello
Hello
World
World
Hello
Hello
World
World
Hello
  

上文这就是 Goroutine 的一个非常好的案例