设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2542|回复: 7
打印 上一主题 下一主题

[已经解决] 设定执行超时除了线程还有别的实现方式吗

[复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

跳转到指定楼层
1
发表于 2010-10-13 17:27:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
有些时候我们在执行一些可能执行时间过长命令(例如网络通讯)时,希望能设定一个超时,达到设定值如果还没有执行完毕那么就挂起,将控制权交回主程序,然后决定是继续运行还是终止,通常的方式是用Thread,但是这需要额外考虑线程安全等问题以及系统调度线程的额外开销

这个执行基本上是单线的(超时前主线程一直在sleep),所以有没有除Thread之外的方式来实现执行超时?

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

2
发表于 2010-10-13 19:08:15 | 只看该作者
用一个线程检查时间会有...安全考虑?就添加个线程sleep若干秒然后报错,否则dispose之,感觉开销不大...?
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
3
发表于 2010-10-13 20:06:57 | 只看该作者
多进程:$
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

4
发表于 2010-10-14 12:00:27 | 只看该作者
本帖最后由 精灵使者 于 2010-10-14 12:04 编辑

用一个线程检查时间会有...安全考虑?就添加个线程sleep若干秒然后报错,否则dispose之,感觉开销不大...?
这个不错,也可以sleep若干秒以后抛出超时错误,交给游戏处理。
另外如果连接成功的时候随时dispose这个线程(相当于设置计时器)
其实你可以设置一个超时的计时器(例如X = 300),然后可以在系统内设置执行超时的量。
于是,在开始执行的时候,同时初始化并启动超时计时器……
然后当执行完毕的时候,停止计时器并显示执行时间
当计时器超过一定的值(300)的时候,终止执行并抛出执行超时错误。
其实可以设置正计时器或者倒计时器……其实正计时器比较好恩,有利于计算执行的时间。
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

5
 楼主| 发表于 2010-10-16 08:09:15 | 只看该作者
虽然理论上多线程检查时间没啥事。。。但是不知道RM那脑残的解释器做了什么东西,直接给我崩了。。。多进程。。倒是也行??不过RM和ruby192都加载win32process不能- -
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2010-10-16 08:59:18 | 只看该作者
o.o 不要什么都指望 Ruby 给你封装好了,该调用本地 API 的时候还是得掉啊:$
要实现真正的并发得靠内核线程, 用 CreateThread 嘛:$
多进程的话,用 CreateProcess 嘛:$
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

7
 楼主| 发表于 2010-10-16 14:00:19 | 只看该作者
CreateThread这东西给力吗- -
有个Win32Process和Win32Thread的第三方库不过有bug,如果用API比较方便的话直接去完善一下那个库??
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
8
发表于 2010-10-17 00:50:48 | 只看该作者
可以参考:
http://diyrpg.net/bbs/redirect.p ... o=lastpost#lastpost
Ruby 1.8 的线程是绿色线程,是不可能用来做异步的 OS 底层操作的,如异步网络通讯、 I/O;Ruby 1.9 使用了内核线程,所以可以有异步 I/O,但是由于有全局解释器锁,所以仍然不能用于通用的并行计算;CreateThread 是 Windows 的 API 函数,如果想实现真正意义上的并发运行,可以写一个 DLL,在里面处理创建并维护内核线程来完成你需要的异步操作,并用 Win32API 接口来调用就行了。你说的第三方库既然有 BUG,那与其去尝试修复,还不如自己重新写一个轻量级的接口,我们开发员做项目的时候,经理一说要修复 BUG 个个愁眉苦脸,一提要建立新的开发工程人人满脸笑容。

评分

参与人数 1星屑 +400 收起 理由
zh99998 + 400 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 22:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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