多线程入门4-调用窗口对象

admin2020-12-09  245

新手可能不太容易理解,aardio中的这种模式给多线程开发带来了巨大的方便,在aardio的多线程代码中基本很少看到同步锁,也很少会因为同步出现各种BUG和麻烦,以前面并列飞奔的多个火车来比喻,在aardio中每辆火车都只要愉快的往前跑就行了,不存在谁停下来等谁同步的问题。

但不可否认,工作线程中如果能直接操作窗口上的控件那会带来巨大的方便(因为工作线程需要访问界面控件的需求还是非常多的),但这违反了aardio的规则,在aardio的旧版本中这是行不通的,在aardio新版本中,我们愉快的解决了这个问题。现在aardio中可以存在一些特权对象,让一些不能在线程中直接传递的对象可以跨线程传递,例如窗口对象,下面我们看一个例子:

 

import win.ui;
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
    button={cls="button";text="再来个多线程,可以多点几次不会乱的"; ...};
    edit={cls="edit";edge=1;multiline=1;z=1; ...}
)

winform.button.oncommand = function(id,event){
    thread.invoke(
        function(winform){
            for(i=1;10;1){
                winform.edit.print( time.tick(),"线程ID:",thread.getId() );
                sleep(1000)
            }
        },winform
    )
}

winform.show()
win.loopMessage();

注意上面的线程启动函数直接写在了参数里(匿名函数),跟下面的写法作用是一样的:

//下面这个函数执行耗时操作
var doSomething = function( winform ){

    for(i=1;10;1){
        winform.edit.print( time.tick(),"线程ID:",thread.getId() );
        sleep(1000)
    }
}

thread.invoke( doSomething,winform ) //启动线程

 

转载请注明原文地址: https://seopai.com/read-38.html
最新回复(0)