importwin.ui;/*DSG{{*/varwinform = win.form(text="aardio - 后台线程运行Python";right=1163;bottom=753)
winform.add(
button={cls="button";text="调用python线程";left=876;top=663;right=1102;bottom=723;z=2};
edit={cls="edit";left=11;top=16;right=1140;bottom=625;edge=1;multiline=1;z=1}
)/*}}*//*
其实Python并不支持真正的多线程,
Pyhton的多线程GIL管理也不方便,处理不好就会崩溃、死锁。
所以更好的方式是在单线程中运行python,
如果在界面线程中,python需要做耗时操作,
那么可以使用工作线程运行python,下面是一个演示:
*///python服务端线程pyServerThread =function(winform){importthread.command;importpy;//创建命令监听器varcmd = thread.command();//响应事件cmd.pyHash =function(){//可以直接访问界面控件winform.edit.print("子线程正在执行pyHash函数",tostring(time()))varhashlib = py.import("hashlib");varmd5 = hashlib.md5()
md5.update( raw.buffer("注意这个函数的参数不是字符串而是字节数组(相当于aardio中的buffer)") );sleep(1000)//调用界面线的函数winform.pyHashEnd(tostring(md5.hexdigest()) );returntostring(md5.hexdigest());
}//退出线程cmd.pyExit =function(){
win.quitMessage();
}//在工作线程需要启用消息循环,才能响应事件win.loopMessage();
}//启动python服务端线程thread.create( pyServerThread,winform )//增加工作线程可以调用的函数winform.pyHashEnd =function(str){
winform.edit.print("主线程收到:",str)
}importthread.command;
winform.button.oncommand =function(id,event){//禁用按钮,避免重复提交winform.button.disabledText ="正在调用python线程";//异步调用python线程的函数,不等待返回thread.command.post("pyHash")//异步调用python线程的函数,等待返回值varstr = thread.command.sendInvoke("pyHash")
winform.edit.print("主线程收到:",str)//取消按钮禁用状态winform.button.disabledText =null;
}
winform.onClose =function(hwnd,message,wParam,lParam){//退出Python线程thread.command.pyExit()
}
winform.show()
win.loopMessage();