请教关于多个thread.work实例,后者会抑制前者问题

By 巴克队长 at 2022-10-08 • 0人收藏 • 326人看过

当存在两个以上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在某些位置使用了公共空间,但是不知道怎么设置,才能让两个任务并行运行。

请研究明白的大佬告知下,万分感谢。

screenshots.gif

3 个回复 | 最后更新于 2022-10-01
2022-10-08   #1

经过 光庆 的指点,明白了这个不是多线程的问题,是两个按钮的问题

当两个按钮都执行耗时操作时,假如按钮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就可以看到效果了

2022-10-08   #2

所以你这时候可以在按钮里使用win.settimeout()来异步执行

2022-10-08   #3

回复#2 @admin :

并不是这样的!

其实问题也不是按钮的问题,这个问题的根本原因是,多个在主线程上的耗时操作是相互影响的,只要你在主线程上存在耗时操作,都不行。

想了一圈,最好的方法是

1、将循环操作,改成定时器 分步操作

2、另开线程专门用于任务分配

禁忌:在主线程开多个循环任务,尤其是死循环

登录后方可回帖

登 录
信息栏
公 告:

原域名已转让

临时更换为

Aardio.com.cn

请相互转告!



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 popdes@126.com

友情链接
Aardio官方     |     Aardio官方更新日志
Stm32cube中文网
Sciter在线学习文档
才仁机械


打赏本站
Loading...