请教关于多个thread.work实例,后者会抑制前者问题
By
巴克队长
at 2022-10-08 • 0人收藏 • 966人看过
当存在两个以上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继续执行。测试代码如下:
import win.ui; /*DSG{{*/ var winform = win.form(text="aardio form";right=759;bottom=469) winform.add( button={cls="button";text="Button";left=194;top=120;right=360;bottom=215;z=1}; button2={cls="button";text="Button";left=403;top=121;right=569;bottom=220;z=2} ) /*}}*/ winform.button.oncommand = function(id,event){ for(i=1;20;1){ win.delay(100) console.dump("按钮1:",i) } } winform.button2.oncommand = function(id,event){ for(i=1;20;1){ win.delay(100) console.dump("按钮2:",i) } } winform.show(); win.loopMessage();在按钮1,执行完前,点下按钮2就可以看到效果了