请教关于多个thread.work实例,后者会抑制前者问题
By
巴克队长
at 2022-10-08 • 0人收藏 • 795人看过
当存在两个以上thread.word实例时,后运行的实例会抑制前面的。详细描述如下:
1、先运行work1任务,work1正常运行
2、再运行work2任务,work1会处于暂停状态
3、work2运行完成后,work1会恢复运行
测试代码如下:
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=759;bottom=469) winform.add( button={cls="button";text="work1";left=141;top=82;right=272;bottom=168;z=1}; button2={cls="button";text="work2";left=348;top=64;right=522;bottom=174;z=2} ) /*}}*/ import console; import win.timer console.dump("") import thread.works var work1=thread.works( 10, function(id,...) { import win import math math.randomize() var delay = math.random(500,3000) win.delay( delay ) return string.concat("work1,id=",id,",耗时:",delay) } ); var work2=thread.works( 10, function(id,...) { import win win.delay( 60 ) return string.concat("work2,id=",id,",耗时:60") } ); var tm1 = win.timer() var tm2 = win.timer() tm1.disable() tm2.disable() tm1.onTimer = function(){ while(var r= work1.pop() ){ console.dump(r) if(work1.finished() and !pushing1 ){ console.dump("work1,finished") tm1.disable() } } } tm2.onTimer = function(){ while(var r= work2.pop() ){ console.dump(r) if(work2.finished() and !pushing2 ){ console.dump("work2,finished") tm2.disable() } } } winform.button.oncommand = function(id,event){ tm1.enable() pushing1=true for(i=1;100;1) work1.push(i) pushing1=false } winform.button2.oncommand = function(id,event){ tm2.enable() pushing2=true for(i=1;100;1) work2.push(i) pushing2=false } winform.show(); win.loopMessage();
猜测可能是和thread在某些位置使用了公共空间,但是不知道怎么设置,才能让两个任务并行运行。
请研究明白的大佬告知下,万分感谢。
3 个回复 | 最后更新于 2022-10-01
登录后方可回帖
经过 光庆 的指点,明白了这个不是多线程的问题,是两个按钮的问题
当两个按钮都执行耗时操作时,假如按钮1没有执行完的时候,按下了按钮2,那么按钮1将会暂停,直到按钮2的耗时操作执行完了,才返回按钮1继续执行。测试代码如下:
在按钮1,执行完前,点下按钮2就可以看到效果了