Project1

标题: 设定执行超时除了线程还有别的实现方式吗 [打印本页]

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

这个执行基本上是单线的(超时前主线程一直在sleep),所以有没有除Thread之外的方式来实现执行超时?
作者: IamI    时间: 2010-10-13 19:08
用一个线程检查时间会有...安全考虑?就添加个线程sleep若干秒然后报错,否则dispose之,感觉开销不大...?
作者: 紫苏    时间: 2010-10-13 20:06
多进程:$
作者: 精灵使者    时间: 2010-10-14 12:00
本帖最后由 精灵使者 于 2010-10-14 12:04 编辑

用一个线程检查时间会有...安全考虑?就添加个线程sleep若干秒然后报错,否则dispose之,感觉开销不大...?
这个不错,也可以sleep若干秒以后抛出超时错误,交给游戏处理。
另外如果连接成功的时候随时dispose这个线程(相当于设置计时器)
其实你可以设置一个超时的计时器(例如X = 300),然后可以在系统内设置执行超时的量。
于是,在开始执行的时候,同时初始化并启动超时计时器……
然后当执行完毕的时候,停止计时器并显示执行时间
当计时器超过一定的值(300)的时候,终止执行并抛出执行超时错误。
其实可以设置正计时器或者倒计时器……其实正计时器比较好恩,有利于计算执行的时间。
作者: zh99998    时间: 2010-10-16 08:09
虽然理论上多线程检查时间没啥事。。。但是不知道RM那脑残的解释器做了什么东西,直接给我崩了。。。多进程。。倒是也行??不过RM和ruby192都加载win32process不能- -
作者: 紫苏    时间: 2010-10-16 08:59
o.o 不要什么都指望 Ruby 给你封装好了,该调用本地 API 的时候还是得掉啊:$
要实现真正的并发得靠内核线程, 用 CreateThread 嘛:$
多进程的话,用 CreateProcess 嘛:$
作者: zh99998    时间: 2010-10-16 14:00
CreateThread这东西给力吗- -
有个Win32Process和Win32Thread的第三方库不过有bug,如果用API比较方便的话直接去完善一下那个库??
作者: 紫苏    时间: 2010-10-17 00:50
可以参考:
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 个个愁眉苦脸,一提要建立新的开发工程人人满脸笑容。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1