|
如下所示的代码,在界面中单击按钮停止后,界面卡死几秒钟,然后console打印"线程停止失败",去掉thrdTest线程中的 winform.richedit.appendText("停了!"),然后再测试就正常了,请大家帮我解惑,增加 winform.richedit.appendText("停了!") 这句代码,为什么console会打印"线程停止失败",谢谢!
- import win.ui;
- /*DSG{{*/
- var winform = win.form(text="aardio form";right=479;bottom=235)
- winform.add(
- button={cls="button";text="Start";left=132;top=14;right=324;bottom=56;z=1};
- richedit={cls="richedit";left=4;top=66;right=476;bottom=232;edge=1;multiline=1;z=2}
- )
- /*}}*/
- import console;
- var thrdHandle = null;
- thrdTest = function(winform){
- import console;
-
- winform.richedit.text = "";
-
- /*
- thread.lock创建一个临界区,
- 在多线程中同时只能有一个线程进入相同名字的临界区,
- 这是为了避免同时访问同一资源,例如大家都争着去写控制台,你写几个字符,他写几个字符,结果写出来谁也看不懂了。
- aardio中需要用临界区的时候并不多,因为每个线程都有自己的变量环境不会相互冲突,很少需要去加锁考虑同步这些麻烦的问题。
- */
- thread.lock("写控制台",function(){
- console.log("线程在执行",thread.getId())
- })
-
- /*
- thread.get用于访问线程共享变量。
- 每个线程的全局变量环境都是独立的,而 thread.get() 则用于获取所有线程共享的全局变量。
- */
- while(!thread.get("红灯停")){ //这里如果高级点可以用 thread.event来实现信号判断,参考本目录下的定时器范例
- console.log("线程在执行",time() )
- winform.richedit.appendText("线程在执行" ++ '\r\n');
- sleep(1000)
- }
-
- winform.richedit.appendText("停了!");
- console.log("停了!");
- }
- winform.button.oncommand = function(id,event){
- if ("Stop" == winform.button.text) {
- //每个线程的全局变量环境都是独立的,而 thread.set() 则用于设置所有线程共享的全局变量。
- thread.set("红灯停", true)
-
- /*
- 等待所有线程完成,下面的参数可以是一个或多个线程句柄,也可以是包含多个线程句柄的数组。
- 这个函数是阻塞并等待所有线程完成,如果是只等待某个线程返回,则需要使用 thread.waitOne()
- thread.waitOne() 如果在界面线程中他不会阻塞界面的消息循环( 就是还能响应用户对界面的操作,而不是卡住没响应 )
- */
- if (true != thread.waitAll(thrdHandle, 5000)) {
- console.log("线程停止失败!");
- }
-
- thread.set("红灯停", null)
-
- //句柄不用的时候一定要用下面的函数关闭(切记:句柄是绝对不会自动释放的),关闭句柄并不会关闭线程
- raw.closehandle(thrdHandle)
-
- winform.button.text = "Start";
- } else {
- thrdHandle = thread.create(thrdTest, winform);
- winform.button.text = "Stop";
- }
- }
- winform.show();
- win.loopMessage();
- return winform;
复制代码
|
|