发布 winThreadTask 扩展库, 用于创建线程并且接收返回值

By terrorist at 2022-05-28 • 1人收藏 • 536人看过
import thread.command;
import win.guid;

namespace aaz;
class winThreadTask{
	ctor(){
		var thCmd = ..thread.command()
	};
	create = function(func, onEnd, ...){
		var guid = tostring(..win.guid.create());
		thCmd[guid] = function(...){
			onEnd(...);
			thCmd[guid] = null;
		}

		..thread.invoke( 
			function(func, guid, ...){
				import thread.command;
				
				thread.command.post(guid, func(...))
			}, func, guid, ...
		)
	}	
}


create ( 线程函数, 接收返回值的函数, 线程函数的不定个参数 )

与 thread.manage 的 create 区别:使用简单,不用执行 manage.waitClose() 才能接收返回值


与  thread.invokeAndWait 的区别:同时执行多个线程函数时不用等待耗时较长的那个函数



使用例子如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="sleep 2000";left=37;top=64;right=156;bottom=103;z=3};
button2={cls="button";text="sleep 5000";left=41;top=118;right=153;bottom=158;z=4};
button3={cls="button";text="sleep 2000";left=226;top=65;right=345;bottom=104;z=5};
button4={cls="button";text="sleep 5000";left=226;top=119;right=338;bottom=159;z=6};
button5={cls="button";text="sleep 2000";left=422;top=65;right=541;bottom=104;z=8};
button6={cls="button";text="sleep 5000";left=422;top=119;right=534;bottom=159;z=9};
groupbox={cls="groupbox";text="winThreadTask";left=22;top=35;right=171;bottom=175;edge=1;z=1};
groupbox2={cls="groupbox";text="thread.invokeAndWait";left=211;top=36;right=366;bottom=177;edge=1;z=2};
groupbox3={cls="groupbox";text="thread.manage";left=407;top=36;right=562;bottom=177;edge=1;z=7}
)
/*}}*/

import thread.manage;
import aaz.winThreadTask;

var task = aaz.winThreadTask()
var manage = thread.manage(10)

var threadFunc = function(duration){
	sleep(duration)
}


winform.button.oncommand = function(id,event){
	winform.button.disabled = true
	task.create(
		threadFunc,
		function(){
			winform.button.disabled = false	
		},
		2000
	)
}

winform.button2.oncommand = function(id,event){
	winform.button2.disabled = true
	task.create(
		threadFunc,
		function(){
			winform.button2.disabled = false	
		},
		5000
	)	
}

winform.button3.oncommand = function(id,event){
	owner.disabled = true
	thread.invokeAndWait(threadFunc, 2000)
	owner.disabled = false
}

winform.button4.oncommand = function(id,event){
	owner.disabled = true
	thread.invokeAndWait(threadFunc, 5000)
	owner.disabled = false	
}

winform.button5.oncommand = function(id,event){
	owner.disabled = true
	
	manage.create(threadFunc, 2000).onEnd = function(...){
		winform.button5.disabled = false
	} 
	
	manage.waitClose() 	
}

winform.button6.oncommand = function(id,event){
	owner.disabled = true
	
	manage.create(threadFunc, 5000).onEnd = function(...){
		winform.button6.disabled = false
	} 
	
	manage.waitClose() 		
}

winform.show();
win.loopMessage();


4 个回复 | 最后更新于 2022-05-29
2022-05-28   #1

真不错,感谢分享

2022-05-28   #2

2022-05-29   #3

想利用这个库实现在 web.sciter 里面执行耗时函数,执行完毕后运行一个回调函数, 为什么以下代码会报错呢 ?

import win.ui;
/*DSG{{*/
var winform = win.form(text="external 接口";right=1014;bottom=523)
winform.add()
/*}}*/

 io.open()

import thread.command;
import web.sciter;
import web.sciter.debug

var wbSciter = web.sciter( winform );
wbSciter.attachEventHandler(web.sciter.debug)

var thCmd = thread.command()

wbSciter.external = {
    func = function(param, proc){ 
         //proc(1,2)
       thCmd.end = function(){	
       		proc(1,2)
       }
       
       thread.invoke( 
       		function(){
       			import thread.command
       			thread.command.post( "end")
       		}
       )
    }
}

wbSciter.html = /**
<body> 
<button id="my-button">调用耗时函数</button> 
<script>

document.on("click", "#my-button", (evt, dom)=>{
	external.func( "参数", 
		function(a,b){
			dom.textContent = "执行完毕"
	} )
})

</script>
</body>
**/

winform.show();	
win.loopMessage();


2022-05-29   #4

测试出一个解决方案,要先把 proc 复制一份

var procCopy = proc.clone()

完整如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="external 接口";right=1014;bottom=523)
winform.add()
/*}}*/
 
 io.open()
 
import thread.command;
import web.sciter;
import web.sciter.debug
 
var wbSciter = web.sciter( winform );
wbSciter.attachEventHandler(web.sciter.debug)
 
var thCmd = thread.command()
 
wbSciter.external = {
    func = function(param, proc){ 
       var procCopy = proc.clone()
  
       thCmd.end = function(){ 
             procCopy()
       }
        
       thread.invoke( 
             function(){
                 import thread.command
                 thread.command.post( "end")
             }
       )


    }
}
 
wbSciter.html = /**
<body> 
<button id="my-button">调用耗时函数</button> 
<script>
 
document.on("click", "#my-button", (evt, dom)=>{
    external.func( "参数", 
        function(a,b){
            dom.textContent = "执行完毕"
    } )
})
 
</script>
</body>
**/
 
winform.show(); 
win.loopMessage();


登录后方可回帖

登 录
信息栏
公 告:

专注分享

谢绝纯提问

谢谢合作!
本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...