Ai
1 Star 0 Fork 0

c./炫彩类

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
MultithreadOperationUI.go 3.22 KB
一键复制 编辑 原始数据 按行查看 历史
admin 提交于 2024-12-31 00:31 +08:00 . 2024-12-11
// 多协程操作UI, 方式1
// 必须在UI线程操作UI, 否则随机发生崩溃.
package main
import (
"fmt"
"math/rand"
"strconv"
"sync"
"time"
app "gitee.com/go_888/xcgui/app"
widget "gitee.com/go_888/xcgui/widget"
window "gitee.com/go_888/xcgui/window"
xcc "gitee.com/go_888/xcgui/xcc"
)
var (
a *app.X结构_全局API
w *window.Window
btn *widget.X结构_按钮
ls *widget.X结构_列表
rwm sync.RWMutex
wg sync.WaitGroup
t time.Time
)
func main() {
rand.Seed(time.Now().UnixNano())
a = app.X创建(true)
a.X启用DPI(true)
a.X启用自动DPI(true)
w = window.X创建窗口(0, 0, 550, 300, "MultithreadOperationUI", 0, xcc.X窗口样式_默认样式)
// 创建按钮
btn = widget.X创建按钮(15, 33, 70, 24, "click", w.X句柄)
btn.X事件_被单击(onBnClick)
// 创建列表
ls = widget.X创建列表(10, 60, 530, 230, w.X句柄)
ls.X创建列表头数据适配器() // 创建表头数据适配器
ls.X创建数据适配器(5) // 创建数据适配器, 5列
// 添加列
ls.X添加列文本(100, "name1", "column1")
ls.X添加列文本(100, "name2", "column2")
ls.X添加列文本(100, "name3", "column3")
ls.X添加列文本(100, "name4", "column4")
ls.X添加列文本(100, "name5", "column5")
// 置列表数据
for i := 1; i < 10; i++ {
id := strconv.Itoa(i)
index := ls.X添加行文本("item" + id + "-column" + id)
ls.X设置项文本(index, 1, "item"+id+"-column"+id)
ls.X设置项文本(index, 2, "item"+id+"-column"+id)
ls.X设置项文本(index, 3, "item"+id+"-column"+id)
ls.X设置项文本(index, 4, "item"+id+"-column"+id)
}
a.X显示窗口并运行(w.X句柄)
a.X退出()
}
// 按钮单击事件
func onBnClick(pbHandled *bool) int {
if !btn.X是否启用() {
return 0
}
btn.X启用(false)
btn.X重绘(false)
go func() {
t = time.Now() // 记录开始的时间
// 多协程操作列表框数据
for i := 0; i < 2022; i++ {
wg.Add(1)
// go setText(0) // 像这样直接另起协程操作UI次数多了程序必将崩溃, 你可以测试一下
// 必须在UI线程操作UI, 否则随机发生崩溃, 何为UI线程?
// 一个是在事件回调函数内, 例如: onBnClick. 这些回调函数都是在UI线程内执行的, 也就是消息循环内.
// 另一个就是 炫彩_调用界面线程 相关函数: a.CallUiThreadEx(), a.CallUT(), a.CallUiThreader().
go func() {
a.X调用界面线程EX(setText, 0) // 这样是在UI线程进行UI操作, 就不会崩溃了
}()
wg.Done()
}
wg.Wait()
// 如果不需要传参数进回调函数, 也不需要返回值时可以调用CallUT(), 回调函数写法能简单些.
a.X简易调用界面线程(func() {
ls.X刷新项数据() // 刷新列表项数据, 不刷新的话修改的数据不会立即显示的
ls.X重绘(false) // 列表重绘
btn.X启用(true)
btn.X重绘(false)
w.X消息框("提示", fmt.Sprintf("全部执行完毕, 耗时: %v", time.Since(t)), xcc.X消息框_确定按钮, xcc.X窗口样式_默认样式)
})
}()
return 0
}
func setText(data int) int {
item := rand.Int31n(ls.X取项数量AD())
col := rand.Int31n(ls.X取列数量())
text := strconv.Itoa(rand.Intn(1000) + 1000)
rwm.RLock()
ls.X设置项文本(item, col, text)
rwm.RUnlock()
return 0
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/go_888/xcgui.git
git@gitee.com:go_888/xcgui.git
go_888
xcgui
炫彩类
6402001f8570

搜索帮助