# 例程2:本例程是一个线程绘图程序,主线程向绘图子线程传递数据,子线程负责播放。
global DataList # 全局列表变量用于向线程传递数据
global changeData = 1 # 用于标记当前组数据是否播放结束,1表示当前数据播放结束,需要传递新的数据
global isExit = 0 # 1表示退出线程
gui = GUI()
gui.HideConsoleWindow()
time = TIME()
def ThreadDrawing()
{
title = "绘画" # 窗口标题
size = [10,3,86,37] # 窗口尺寸
list = [title,size]
num = gui.Fine(list) # 创建Fine窗口,并返回资源ID
while gui.FineClosed(num) != -1 # 检查窗口关闭消息
{
PowerDown(3)
if changeData == 0
{
for i in DataList # 遍历列表
{
drawlist = i # 取出一个列表项,绘制命令
gui.Drawing(num,i) # 绘制
time.sleep(50) # 延迟
}
changeData = 1 # 当前DataList中的数据播放完毕,值changeData = 1申请下一组数据
}
}
isExit = 1 # 程序至此表明子线程创建的窗口已关闭,置标志 isExit = 1,用于控制主线程退出循环
}
# 主线程
drawlist0 = ["CanvasBrush",20,20,640,510,255,0,0] # 自制画布
drawlist1 = ["CanvasImage",20,20,640,510,"exampleRes\\fine5.jpg"] # 使用图片作为画布
drawlist2 = ["Text","欢迎你世界!",0,0,"微软雅黑",38,0,255,0] # 在图片上绘制文字
drawlist3 = ["Point",40,80,0,0,255] # 画一个蓝色的点
drawlist4 = ["Line",0,0,200,200,0,2,0,0,255] # 画线
drawlist5 = ["Rectangle",200,70,60,80,0,4,0,255,0] # 画矩形,不带填充色
drawlist6 = ["RectangleFill",300,130,100,200,0,4,0,255,0,0,255,0] # 画矩形,带填充色
drawlist7 = ["RoundRect",420,70,100,60,1,4,50,30,0,255,0] # 画圆角矩形,不带填充色
drawlist8 = ["RoundRectFill",540,120,60,130,3,4,50,30,0,255,0,0,0,255] # 画圆角矩形,带填充色
drawlist9 = ["Polyline",50,200,60,300,90,250,70,180,0,4,0,255,0] # 开放多边形
drawlist10 = ["Polygon",110,200,120,300,150,250,130,180,0,4,0,255,0] # 封闭多边形,不填充
drawlist11 = ["PolygonFill",170,200,180,300,210,250,190,180,0,4,0,255,0,0,0,255] # 开放多边形
drawlist12 = ["Circle",300,270,50,2,4,0,255,0] # 画圆,不填充
drawlist13 = ["CircleFill",420,200,50,0,4,0,255,0,0,0,255] # 画圆,填充颜色
drawlist14 = ["Ellipse",90,380,120,100,3,4,0,255,0] # 画椭圆,无填充颜色
drawlist15 = ["EllipseFill",220,380,100,140,3,4,0,255,0,0,0,255] # 画椭圆,有填充颜色
drawlist16 = ["Chord",340,400,100,70,30,120,3,4,0,255,0] # 画闭合弦,无填充颜色
drawlist17 = ["ChordFill",430,400,100,70,30,120,3,4,0,255,0,0,0,255] # 画闭合弦,有填充颜色
drawlist18 = ["Pie",530,400,100,70,30,120,3,4,0,255,0] # 画扇形,无填充颜色
drawlist19 = ["PieFill",510,320,70,120,0,120,3,4,0,255,0,0,0,255] # 画扇形,有填充颜色
drawlist20 = ["Arc",300,300,400,200,-20,150,3,4,0,255,0] # 画弧
drawlist21 = ["AddImage",120,120,100,100,"exampleRes\\fine8.jpg"] # 添加图片
# 播放数据列表一(自制画布)
DataList0 = [drawlist0,drawlist2,drawlist3,drawlist4,drawlist5,drawlist6,drawlist7,drawlist8,\
drawlist9,drawlist10,drawlist11,drawlist12,drawlist13,drawlist14,drawlist15,drawlist16,\
drawlist17,drawlist18,drawlist19,drawlist20,drawlist21]
# 播放数据列表二(图片画布)
DataList1 = [drawlist1,drawlist2,drawlist3,drawlist4,drawlist5,drawlist6,drawlist7,drawlist8,\
drawlist9,drawlist10,drawlist11,drawlist12,drawlist13,drawlist14,drawlist15,drawlist16,\
drawlist17,drawlist18,drawlist19,drawlist20,drawlist21]
thread = THREAD() # 定义一个线程变量
thread = thread.CreateThread(ThreadDrawing) # 默认新创建的线程处于悬挂状态,不会执行
thread.start() # 线程的start()方法,将启动当前thread线程运行
next = True # 初始化,控制播放内容切换
while True
{
PowerDown(3)
if isExit == 1 {break} # 检查子线程ThreadDrawing是否退出,如果退出,跳出主循环,结束程序
if changeData == 1 # 检查是否需要提交下一组数据
{
if next # 根据next的值来确定提交哪一组数据
{
DataList = DataList0 # next为True,提交第一组数据
changeData = 0 # 数据提交后,允许播放
next = not next # 对变量next取反,控制交替播放DataList0和DataList1的内容
}
else
{
DataList = DataList1 # next为False,提交第二组数据
changeData = 0 # 数据提交后,允许播放
next = not next # 对变量next取反,控制交替播放DataList0和DataList1的内容
}
}
}