搜索
查看: 18649|回复: 11

[win] 延时、定时器函数用法

  [复制链接]

186

主题

2535

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13924
发表于 2011-9-1 21:28:19 | 显示全部楼层 |阅读模式

一、延时函数 winform.setTimeout()

此函数类似Javascript中的window.setTimeout() 函数
可参考百度百科 http://baike.baidu.com/view/1861781.htm

1.1 函数原型

winform.setTimeout( 函数或代码,延时值,其他参数 )

第一个函数可以是一个函数对象,也可以是一个字符串对象(包含需要延时执行的aardio代码)
第二个是可选参数,指定延时值,以毫秒为单位, 默认为100毫秒.
第三个参数开始可选添加任意多个附加参数,附加参数将会传递给将要延时执行的函数.
函数返回一个计时器ID, 可以使用 winform.settimer() 修改时间间隔, 或使用 winform.killtimer() 删除计时器

1.2 函数说明

延时能指定异步延时执行的函数或代码,
因为无需等待异步执行的任务返回,是以可避免当前代码阻塞、使之可以继续执行.

1.3 函数示例



import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; text="aardio Form";right=349;bottom=249 )
winform.add(  )
/*}}*/

winform.setTimeout(
   
function(){
        winform.msgbox(
"延时执行的对话框")
    }
    ,1000
)
     
winform.show()
win.loopMessage();



没有悬念,上面的用法与Javascript的用法基本一样.
不过不同的是,winform.setTimeout() 还可以传递参数给延时函数, 下面是一个简单的例子


import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; text="aardio Form";right=349;bottom=249 )
winform.add(  )
/*}}*/

io.open()

winform.setTimeout(
    io.print ,1000
             , "测试","传参数给io.print"
)
     
winform.show()
win.loopMessage();



二、创建定时器函数 winform.addtimer()

2.1 函数原型

winform.addtimer(延时值,定时函数)
第一个参数指这定时间间隔,以毫秒为单位.
函数返回一个计时器ID, 可以使用 winform.settimer() 修改时间间隔, 或使用 winform.killtimer() 删除计时器.

2.2 函数说明

指定一个函数,并定时执行
定时函数可选返回一个值, 返回false或0取消定时器, 返回非零数值可修改计时器间隔.

2.3 函数示例



import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; text="aardio Form";right=349;bottom=249 )
winform.add(  )
/*}}*/

io.open()

var tmId = winform.addtimer(
    1000,
    function(hwnd,msg,id,tick){
        io.print( hwnd,msg,id,tick )
        return 3000; //将时间间隔修改为3000
    }
)
     
winform.show()
win.loopMessage();


2.4 自动生成定时器代码

在窗体设计器中, 点击"工具箱->定时器" 可自动生成定时器代码.


三、修改计时器函数 winform.settimer()

3.1 函数原型

winform.settimer( 计时器ID, 新的时间间隔, 新的回调函数 )

3.2 函数说明

修改计时器的时间间隔,
参数为 winform.setTimeout() 或 winform.addtimer() 返回的计时器ID,
第三个参数可选.



四、删计时器函数 winform.killtimer()

3.1 函数原型

winform.killtimer( 计时器ID )

3.2 函数说明

删除指定的计时器,
参数为 winform.setTimeout() 或 winform.addtimer() 返回的计时器ID,


此函数并非必须调用,
winform.addtimer() 创建的计时器在窗体关闭时就会自动删除.
winform.setTimeout()  创建的计时器在函数触发时自动删除.

回复

使用道具 举报

51

主题

265

帖子

1548

积分

四级会员

Rank: 6Rank: 6

积分
1548
发表于 2011-9-1 21:36:37 | 显示全部楼层

{:3_41:}沙发。

沙发。
回复

使用道具 举报

52

主题

1340

帖子

7326

积分

荣誉会员

Rank: 8Rank: 8

积分
7326
发表于 2011-9-1 23:26:48 | 显示全部楼层

顶一下支持,貌似 winform.setTimeout 可以代替win.delay函数了

顶一下支持,貌似 winform.setTimeout 可以代替win.delay函数了
回复

使用道具 举报

65

主题

953

帖子

5036

积分

荣誉会员

Rank: 8Rank: 8

积分
5036
发表于 2011-9-1 23:42:00 | 显示全部楼层

[quote][size=2][color=#999999]qqmmcc 发表于 2011-9-1 23:26[/color] [url=forum.php?m

qqmmcc 发表于 2011-9-1 23:26
顶一下支持,貌似 winform.setTimeout 可以代替win.delay函数了

用处不同吧...不可能代替的..

点评

嗯,我想起来怎么用了,哈哈  发表于 2011-9-1 23:48
aaa
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2011-9-2 06:13:53 | 显示全部楼层

[i=s] 本帖最后由 编程 于 2011-9-2 06:18 编辑 [/i] [code]import win.ui; /*DSG{{*/ var wi

本帖最后由 编程 于 2011-9-2 06:18 编辑
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(parent=...; text="aardio Form";right=349;bottom=249 )
  4. winform.add(  )
  5. /*}}*/

  6. io.open()
  7. win.delay(1000)
  8. io.print("abc")
  9. io.print(123);

  10. winform.show()
  11. win.loopMessage();
复制代码
win.delay() 是同步阻塞的,可以看到上面的代码在窗体显示前等待了1000毫秒。
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(parent=...; text="aardio Form";right=349;bottom=249 )
  4. winform.add(  )
  5. /*}}*/

  6. io.open()

  7. winform.setTimeout(  io.print ,  , "abc" )
  8. io.print(  123 )

  9. winform.show()
  10. win.loopMessage();
复制代码
winform.setTimeout() 是异步非阻塞的,所以后面的io.print(123) 会先执行。
窗体显示的速度也会很快,这就是支持异步的好处。

回复

使用道具 举报

6

主题

167

帖子

903

积分

荣誉会员

爱生活,爱拉芳。

Rank: 8Rank: 8

积分
903
发表于 2011-9-2 10:04:28 | 显示全部楼层

所有异步都是重开一个线程(纤程)来实现的吧,

所有异步都是重开一个线程(纤程)来实现的吧,
专注、深入。
回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
发表于 2011-9-2 10:19:00 | 显示全部楼层

定时器是单线程(GUI线程里)异步. 并没有创建新的线程。 定时器只不过预订了一个执行任务的机会而已。 普通调用函数是自已去完成任务, 使用定时器异目

定时器是单线程(GUI线程里)异步. 并没有创建新的线程。
定时器只不过预订了一个执行任务的机会而已。

普通调用函数是自已去完成任务,
使用定时器异目执行函数是把任务委派给别人(消息循环 )去完成。
消息循环也就是 win.loopMessage(); 语句创建的while循环,他会不停的检测消息队列,并自动触发预设的定时器函数。

线程与纤程不是一回事,纤程也是单线程才有的概念。
纤程是单线程里的多任务,但他不是异步的。

线程就好像你把多个工作,让多个人(线程)同时去做,
每人(线程)做一件事。

而纤程就好像你一个人去做多件事,
这个做一会,那个做一会,就好像你一边吃饭一边上网一边发贴子,
吃两口饭,打几个字,再回去吃几口饭,然后再打几个字,最后你一个人(一个线程)把饭也吃完了,贴子也发完了。



点评

同意: 5.0 真棒: 5.0
继续努力: 5.0
同意: 5 真棒: 5
每次看超版的回复都收获颇丰  发表于 2012-6-20 09:48
真棒: 5
通俗易懂,把抽象晦涉的东东比喻的具体清晰,几秒钟把线程,纤程两个概念了解大概。  发表于 2011-9-9 08:22
同意: 5 真棒: 5 继续努力: 5
收藏,清晰明了!  发表于 2011-9-2 14:08
回复

使用道具 举报

0

主题

23

帖子

164

积分

一级会员

Rank: 2

积分
164
发表于 2011-9-3 08:45:14 | 显示全部楼层

setTimeout和addTimer的区别是什么?是执行一次和循环执行不同吗?从上面没太看出来

setTimeout和addTimer的区别是什么?是执行一次和循环执行不同吗?从上面没太看出来
回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
发表于 2011-9-3 09:32:07 | 显示全部楼层

[i=s] 本帖最后由 quicker 于 2011-9-3 09:41 编辑 [/i] [quote][size=2][color=#999999]gang

本帖最后由 quicker 于 2011-9-3 09:41 编辑
gangz 发表于 2011-9-3 08:45
setTimeout和addTimer的区别是什么?是执行一次和循环执行不同吗?从上面没太看出来

1、winform.setTimeout() 内部是调用 winfomr.addTimer() 实现

2、winform.setTimeout() 仅执行一次,
     winfomr.addTimer() 即可定时执行,也可以执行一次(回调函数返回false)

3、winform.setTimeout(延时值,回调函数, 其他参数) 他的第一个参数是延时值,
     而 winfomr.addTimer() 是反过来的,第二个参数是延时值.

4、winform.setTimeout(延时值,回调函数, 其他参数) 可以附加其他参数传递给回调函数,
     winfomr.addTimer() 的传递给回调函数的回调参数是默认的(hwnd,msg,id,tick)

5、winform.setTimeout() 的回调函数可以是一段代码(也就是字符串) ,例如:
  1. winform.setTimeout("io.open();io.print(1,2,3);");
复制代码
6、winform.setTimeout() 与 Javascript中比较常用的 window.setTimeout()  用法基本一致。
     而 winfomr.addTimer() 与 Javascript 中的 setInterval()  只是用途类似,参数用法有小小的区别。


回复

使用道具 举报

0

主题

23

帖子

164

积分

一级会员

Rank: 2

积分
164
发表于 2011-9-9 07:48:39 | 显示全部楼层

谢谢回复,抽空用代码验证下看看

谢谢回复,抽空用代码验证下看看
回复

使用道具 举报

3

主题

33

帖子

192

积分

培训班

积分
192
发表于 2016-11-18 13:28:04 | 显示全部楼层
请问如果想让定时器暂停,再继续执行应该怎么做?
回复

使用道具 举报

3

主题

33

帖子

192

积分

培训班

积分
192
发表于 2016-11-18 13:32:39 | 显示全部楼层
rebellion51 发表于 2016-11-18 13:28
请问如果想让定时器暂停,再继续执行应该怎么做?

看到了论坛里“飞鱼”的做法,记录一下
winform.button.oncommand = function(id,event){
    //win.msgbox( winform.button.text );
    winform.settimer(tmid,-1)//暂停
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-8-14 21:16 , Processed in 0.078125 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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