代码拉取完成,页面将自动刷新
// 多协程操作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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。