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

Project1

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

[已经解决] 请教如何中止一个执行中的API

[复制链接]

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
跳转到指定楼层
1
发表于 2010-11-26 12:30:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
call了某个API后程序无响应,请教如何在call了5秒后中止并弹出“中止”的对话框

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2010-11-26 14:34:29 | 只看该作者
在自己创建的一个 OS 线程中调用 API,另一个线程计时,超时中断调用 API 的线程。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
3
 楼主| 发表于 2010-11-26 14:36:36 | 只看该作者
我是创建一个线程执行,结果卡死
“另一个线程计时,超时中断调用 API 的线程”
这个不知道该怎么弄
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

4
发表于 2010-11-26 15:01:50 | 只看该作者
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

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

开拓者贵宾

5
发表于 2010-11-26 18:16:21 | 只看该作者
本帖最后由 IamI 于 2010-11-26 18:20 编辑
  1. $t = Thread.new{sleep(5);print "超时";exit!;}
  2. sleep(2)
  3. $t.kill
复制代码
  1. $t = Thread.new{sleep(5);print "超时";exit!;}
  2. sleep(10)
  3. $t.kill
复制代码
事实证明一个叹号改变一切。
额,这里的例是强制退出。如果需要终止执行的API请将API提交另一线程,将现在的线程内容写入主线程,超时KILL之即可。
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
6
 楼主| 发表于 2010-11-26 18:49:05 | 只看该作者
回复 IamI 的帖子

我把sleep(2)换成我那个可能卡死的API后,我发现只要执行到这个API后,包括下面的$t.kill都不会执行了,就卡在那个API上
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

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

开拓者贵宾

7
发表于 2010-11-26 19:57:32 | 只看该作者
额……线程中的弹框有没有出现?出现的话请按照之前的说明:
如果需要终止执行的API请将API提交另一线程,将现在的线程内容写入主线程,超时KILL之即可。
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
8
 楼主| 发表于 2010-11-26 20:13:39 | 只看该作者
本帖最后由 赛露休斯 于 2010-11-26 20:14 编辑

加入线程也没用,我甚至在线程中创建线程把该API放进去依然没用,我用p命令测试,凡是执行到这个API就卡死,后面的命令全都不被执行
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
9
发表于 2010-11-26 21:05:55 | 只看该作者
本帖最后由 苏小脉 于 2010-11-27 05:55 编辑

不是说了么,让你创建 OS 线程。四五楼使用的是 Ruby 的线程,在 Ruby 1.8 中是属于万恶的绿色线程,在调用 OS 底层耗时的东西时无法进行上下文切换。1.8 自始至终都只有一个 OS 线程作为解释器在运行,执行权在交给底层的 API 后,自然解释器就完全失去了程序控制权,这时线程调度器自然也瘫痪了。

即便是使用了本地线程的 Ruby 1.9,由于有 GIL 的存在,当调用 API 的线程获得执行权后,就会对 GIL 进行加锁,所以虽然其它线程都是 OS 线程,但却都被锁在了外面,只能等待里面调用 API 的线程结束。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
10
 楼主| 发表于 2010-11-26 21:20:23 | 只看该作者
回复 苏小脉 的帖子

那问题就是如何在RMXP中创建 OS 线程了,能否举个例子?
最近在研究XAS
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-11 10:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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