背景

后台操作过久,界面卡死

效果

进度条有些延迟,并不准确。
在这里插入图片描述

代码
package main

import (
	"fmt"
	"strconv"
	"time"

	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
	"github.com/lxn/win"
)

var mainWindow *walk.MainWindow

func main() {
	// 主界面
	_, err := MainWindow{
		AssignTo: &mainWindow,
		Title:    "ProgressBar Window",
		Size:     Size{Width: 600, Height: 372},
		Layout:   VBox{},
		Children: []Widget{
			PushButton{
				MinSize: Size{Width: 60, Height: 37},

				Text: "Show progress",
				OnClicked: func() {
					doProgress()
				},
			},
		},
	}.Run()
	if err != nil {
		fmt.Println(err)
	}
}

var hWnd win.HWND
var dialog *walk.Dialog
var progressBar *walk.ProgressBar
var jindu *walk.LineEdit
var confirm *walk.PushButton

func doProgress() {
	// 进度条弹窗
	err := Dialog{
		AssignTo: &dialog,
		Title:    "Progress dialog",
		MinSize:  Size{Width: 300, Height: 200},
		Layout:   VBox{},
		Name:     "ProgressBar",
		Children: []Widget{
			Label{
				Text:   "当前进度:",
				Row:    1,
				Column: 1,
			},
			LineEdit{
				AssignTo: &jindu,
				ReadOnly: true,
				Row:      1,
				Column:   2,
			},
			ProgressBar{AssignTo: &progressBar},
			PushButton{
				AssignTo: &confirm,
				Text:     `执行完毕,退出`,
				Enabled:  false, //默认不可用
				OnClicked: func() {
					// 因为弹窗关闭键被取消,按键关闭
					dialog.Close(0)
				},
			},
		},
	}.Create(mainWindow)
	if err != nil {
		fmt.Println(err)
		return
	}
	// 禁止关闭
	hWnd = dialog.Handle()
	hMenu := win.GetSystemMenu(hWnd, false)
	win.RemoveMenu(hMenu, win.SC_CLOSE, win.MF_BYCOMMAND)
	// 开始跑进度条
	dialog.Starting().Attach(func() {
		go progressWorker()
	})
	dialog.Run()
}

func progressWorker() {
	length := 10
	dialog.Synchronize(func() {
		// progressBar.SetRange(0, int(length))
		// 进度条value的起止   value到5进度条开始做走,到10停止
		progressBar.SetRange(5, int(length))
	})
	workWithCallback(length+10, func(n int64) {
		fmt.Println("progress", n)
		dialog.Synchronize(func() {
			progressBar.WidgetBase.SetToolTipText(strconv.FormatInt(n, 10))
			progressBar.SetValue(int(n))
			jindu.SetText(strconv.FormatInt(n, 10))
		})
	})
	// 跑完后按键可用
	confirm.SetEnabled(true)
}

func workWithCallback(length int, callback func(int64)) {
	// value从1到20
	for i := 1; i <= length; i++ {
		time.Sleep(time.Second)
		callback(int64(i))
	}
}