搜索
查看: 6551|回复: 8
打印 上一主题 下一主题

关于界面卡死的问题

[复制链接]

2

主题

4

帖子

23

积分

新手入门

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2013-12-11 20:36:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我在解压操作的时候发现,如果正在处理解压缩,点击工具界面会出现“未响应”问题,直到处理完成,才恢复。根据以往MFC的经验,我将处理放在了线程中操作,但是需要等到压缩操作完成以后才能进行下一步操作,我调用thired.wait(hwnd)也会出现卡死状况。很困扰,应该怎样解决?先谢谢各位了!
回复

使用道具 举报

0

主题

31

帖子

337

积分

培训班

积分
337
QQ
8#
发表于 2014-8-14 10:04:07 | 只看该作者

“编程”的回答永远都是这么有精辟。正在学习线程。顶一个。

“编程”的回答永远都是这么有精辟。正在学习线程。顶一个。
回复

使用道具 举报

13

主题

120

帖子

687

积分

三级会员

Rank: 4

积分
687
7#
发表于 2013-12-12 12:47:55 | 只看该作者

很多人第一次用多线程的时候第一个想到的是thread.wait()。。。

很多人第一次用多线程的时候第一个想到的是thread.wait()。。。
有很多时候,这语言都是相通的。特别是肢体语言。
回复

使用道具 举报

3

主题

26

帖子

234

积分

荣誉会员

Rank: 8Rank: 8

积分
234
6#
发表于 2013-12-11 21:42:06 | 只看该作者

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=63636&ptid=11336][c

编程 发表于 2013-12-11 20:52
thread.wait() 是阻塞的(注意你上面有个错别字,不是thired)
在UI线程里,你应当使用 thread.waitOne()  ...

多谢,学习了!以前还不知道win.invoke在背后做了那么多事情。本来打算试着换用thread.command实现的。
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
5#
发表于 2013-12-11 21:00:03 | 只看该作者

也可以用线程管理器来做这个事: [align=left][font=新宋体][color=#0000ff]import[/color][color=#00

也可以用线程管理器来做这个事:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio Form";right=599;bottom=399 )
winform.add(
button={cls=
"button";text="button";left=222;top=186;right=402;bottom=271;z=1}
)
/*}}*/
  
import thread.manage;
winform.button.oncommand =
function(id,event){

   
var thrd = function(){
            
import console;
            
for(i=1;10;1){
                console.log(
"线程ID",thread.getId(),time() )
            }  
    }
   
   
var mgr = thread.manage();
    mgr.create(thrd).onEnd =
function(...){
        winform.button.text =
"已完成"
    }
    mgr.waitOne();
}

winform.show()
win.loopMessage();


回复

使用道具 举报

2

主题

4

帖子

23

积分

新手入门

Rank: 1

积分
23
地板
 楼主| 发表于 2013-12-11 20:58:32 | 只看该作者

{:3_41:}还真写错了。。。谢谢,问题已经解决,用 thread.waitOne() 就OK了,以后在试试 win.invoke(),谢谢斑竹大哥。{:3_

还真写错了。。。谢谢,问题已经解决,用 thread.waitOne() 就OK了,以后在试试 win.invoke(),谢谢斑竹大哥。
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
板凳
发表于 2013-12-11 20:56:09 | 只看该作者

另外你也可以使用 thread.command 实现线程间响应式的调用命令。下面是一个简单的例子: [code]//调用线程命令 import win.ui

另外你也可以使用 thread.command 实现线程间响应式的调用命令。下面是一个简单的例子:
  1. //调用线程命令
  2. import win.ui;
  3. /*DSG{{*/
  4. var winform = ..win.form(text="线程命令";right=599;bottom=399)
  5. winform.add(
  6. edit={cls="edit";left=12;top=11;right=588;bottom=389;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1}
  7. )
  8. /*}}*/

  9. import thread.command;
  10. var listener = thread.command();
  11. listener.print = function( ... ){
  12.     winform.edit.print( ... ) //将线程传过来的参数追加输出到文本框
  13. }

  14. //创建工作线程,线程内错误信息默认输出到控制台
  15. thread.invoke(

  16.     function(hwnd){
  17.    
  18.         //必须在线程函数内部导入需要的库
  19.         import thread.command;
  20.         
  21.         //调用界面线程的命令
  22.         thread.command.print("hello world",1,2,3);
  23.         
  24.         //也可以用post方法异步调用线程命令,不会等待调用完成
  25.         thread.command.post("print","hello world",1,2,3);
  26.     }
  27. )

  28. //这样写更方便,适合用于编写后台线程触发器之类的支持库
  29. listener.invoke(
  30.     function( hwndListener,... ){
  31.         import thread.command;
  32.         var listener = thread.command.bind(hwndListener);
  33.         
  34.         listener.onBegin()
  35.         listener.print("正在努力执行线程.....")
  36.         listener.onEnd()
  37.     },...
  38. )

  39. winform.show();
  40. win.loopMessage();
复制代码
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
沙发
发表于 2013-12-11 20:52:09 | 只看该作者

[i=s] 本帖最后由 编程 于 2013-12-11 22:34 编辑 [/i] thread.wait() 是阻塞的(注意你上面有个错别字,不是thire

本帖最后由 编程 于 2013-12-11 22:34 编辑

thread.wait() 是阻塞的(注意你上面有个错别字,不是thired)
在UI线程里,你应当使用 thread.waitOne() ,这个他会在等待的过程中自动处理界面消息(界面不会卡住)

你可以使用 win.invoke() 函数来创建线程,这个里面就已经帮你调用了  thread.waitOne(),下面是一个简单的例子:
import win.ui;
/*DSG{{*/
var winform =
win.form(text="aardio Form";right=599;bottom=399 )
winform.add(
button={cls=
"button";text="button";left=222;top=186;right=402;bottom=271;z=1}
)
/*}}*/

winform.button.oncommand =
function(id,event){
    win.
invoke(
        
function(){
            
import console;
            
for(i=1;10;1){
                console.log(
"线程ID",thread.getId(),time() )
               
sleep(1000)
            }
        }
    )
}

winform.show()
win.loopMessage();

你可以运行上面的示例,点击按钮创建线程,可以乱点创建多个线程,界面不会卡住。
而且线程运行完了,win.invoke 还会把返回值送到你原来的函数里回到原来的调用位置。

点评

真棒: 5.0 继续努力: 0.0
真棒: 5 继续努力: 0
编程大哥 你漏了个 “w” 变成“in” 了  发表于 2013-12-11 21:46
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 16:58 , Processed in 0.078125 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表