aardio 文档

aardio 范例: 多线程界面回调

//多线程界面回调

/*
win.ui 创建的窗口(或控件)对象都可以传入工作线程使用。
在工作线程中可调用窗口成员函数,读写窗口属性。
所有调用都会发回界面线程执行(多线程发指令,单线程干活,没有线程交互与同步的负担)。

界面线程中的非窗口对象也可以用 thread.callable 开启此能力。
thread.callable 会创建一个不可见的 MessageOnly 窗口用于代理转发调用消息。
也可以直接在对象的元表中指定 _serialize = ..thread._callableSerialize 以开启此功能。

窗口对象(winform )被传到线程中以后实际上只是一个影子对象,
如果把他的值打印出来,实际上它只有一个 hwnd 的成员字段指明了窗口句柄,

线程中 winform  的作用就如同一个搞外包的。
你每次在线程中调用他的成员函数,他就会调用 thread.callWnd 呼叫界面线程中那个真正的窗体对象:
“喂!喂!请停下来,外包任务你接不接........”

界面线程中的窗体收到这条消息以后很高兴:“只要给钱(参数),当然可以接的.......”
界面窗体在接收到调用消息以后,使用 thread.applyCallWnd(this,wParam,lParam) 将消息解析为函数调用。 
*/

import console; 
import win.ui;

//用win.form创建一个线程外包对象
var ☏ = win.form();
☏.messageOnly();//告诉他不需要显示窗口,只保留能处理消息的功能
☏.count = 0;

//添加一个线程外包函数
☏.printf = function(...){
    ☏.count = ☏.count + 1;
    if(☏.count >= 100 ) win.quitMessage()

    console.printf(...)
}

//循环执行
for(i=1;10;1){

    //创建线程
    thread.invoke( 
        function(☏){

            var tid = thread.getId();

            for(i=1;10;1){

                //调用外包对象的成员函数,让他外包给界面线程执行
                ☏.printf("线程ID:%d 循环次数:%s",tid,i);
                sleep(10);
            }

        },☏/*扔到线程参数里*/
    )
}

win.loopMessage();

console.log("这里用一个控制台演示并不需要窗体,同样可以实现线程间的外包调用");
console.log("但是实际开发中,应在窗体线程中使用,控制台并不适合用来实现消息循环")
console.pause();

Markdown 格式