|
|
楼主 |
发表于 2013-4-13 14:14:12
|
显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 14:38 编辑
2010qaqz111 发表于 2013-4-13 13:06 
_SUB F,* 定义的持久函数是个什么概念?是说这个函数内用 SET& 定义的变量在 _END 后不会销毁,下次进入 ...
》_SUB F,* 定义的持久函数是个什么概念?是说这个函数内用 SET& 定义的变量在 _END 后不会销毁,下次进入该函数其值仍然在,就相当于 c 函数里用 static 定义的变量?
A: 象窗口一样有持久栈,THREAD* 时可以共享其变量。
_SUB ABC,*
SET &A=1
THREAD* .....
_END
这样 A就是共享变量。而不是拷贝。
同时 ABC 必须保证 子线程 运行期间,A 和含A的栈时可用的,不能销毁了。
这样,运行到 _END处, 标记为已终止, 但会等待子线程结束才真正退出并销毁堆栈。
_SUB ABC
SET &A=1
THREAD* .....
_END
则不同, 往上找 持久栈,从此处堆栈树分裂,之后的变量为临时变量,全部建一份拷贝。持久栈和以前的变量则共享。
这里 子线程会建立 A的拷贝。
父线程ABC 运行到_END , A 销毁, ABC的堆栈销毁, ABC完全退出。
2:
》》》THREAD* 与不加 * 的不同之处在于从窗口的_SUB和,*的_SUB里启动子线程的时候,子线程能否共享上级的变量,是这样吗?
是的。 THREAD* 则共享可共享的变量;还保持窗口的父子关系(链),这样可以象被CALL一样直接访问父窗口及其控件。
3>THREAD
* 有*则共享可共享的变量;还保持窗口的父子关系(链)。否则不共享(除::全局变量),掐断窗口的父子关系链。
& &表示强制变为PE变量,能最简单变多线程。就是 给子线程 强加了 ENVI^ ForceLocal=1
$ 提前解释THREAD 后面的命令, 变量直接变成对应的值。可避免一些延迟解释带来的问题。如%1 %循环变量%
A=1 //
LOOP #%&A%<3,
{
THREAD*$ MESS %A%
// 解释为THREAD MESS 1 ,等, 这样不受后面 A=%&A%+1 影响。
CALC #&A=%&A%+1
}
+ +为弃儿线程。程序到结尾是不等待该线程退出。 |
|