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

Project1

 找回密码
 注册会员
搜索
楼主: 赛露休斯
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
11
发表于 2010-11-26 21:35:43 | 只看该作者
回复 赛露休斯 的帖子

用 RM 的话还得靠 DLL,因为 Win32API 线程处理是通过回调函数进行的,回调需要本地函数。

CreateThread 创建本地线程:
http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx

然后在 DLL 里写一个函数,把函数地址导出,传给 CreateThread 的 lpStartAddress 参数。
例子来不及写了,今天下班后如果没有人回复我就帮你写一个吧。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

原来线程里还有这么多学问
太感谢了,那就拜托你了^_^
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
13
发表于 2010-11-27 11:48:04 | 只看该作者
一个例子:
  1. #pragma comment(linker, "/EXPORT:start_async_api=_start_async_api@0")
  2. #pragma comment(linker, "/EXPORT:abort_async_api=_abort_async_api@0")

  3. #include <Windows.h>

  4. static HANDLE hdl_thread;

  5. DWORD WINAPI thread_proc(void* param);

  6. void WINAPI start_async_api() {
  7.         hdl_thread = CreateThread(NULL, 0, thread_proc, 0, 0, NULL);
  8. }

  9. HANDLE WINAPI abort_async_api() {
  10.         TerminateThread(hdl_thread, 0);
  11. }

  12. DWORD WINAPI thread_proc(void* param) {
  13.         for (;;) MessageBox(NULL, "Loop loop and loop ...", "Infinity Inc.", MB_OK);
  14. }
复制代码
这里的 #pragma 指令是针对 MSVC 编译器写的,所以只能用 MSVC 编译;名称修饰是针对 C 的,所以不能生成按 C++ 生成代码;这些都是小节。
在 thread_proc 函数里可以去调用需要调用、耗时的 API,它会在一个独立的内核线程中运行。这里是一个无限弹出消息框的过程。
在 Ruby 中:

  1. start_async_api = Win32API.new('GeneralDllApp', 'start_async_api', 'v', 'v')
  2. abort_async_api = Win32API.new('GeneralDllApp', 'abort_async_api', 'v', 'v')

  3. start_async_api.call
  4. sleep 5
  5. abort_async_api.call
复制代码
一开始调用 start_async_api,创建线程并调用耗时 API,反复弹出消息框(当然,这里的弹出是同步的,下一个消息框弹出前会等待前一个消息框的销毁),但持续五秒后 Ruby 所在的线程调用 abort_async_api,终止了线程,于是不再弹出消息框。

评分

参与人数 1星屑 +700 收起 理由
fux2 + 700 精品回答。

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

只能大致看懂Ruby部分,MSVC看不懂。。。
那么现在该怎么做?
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
15
发表于 2010-11-28 02:49:59 | 只看该作者
回复 赛露休斯 的帖子

代码都给你了,直接编译为 DLL 即可。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
16
 楼主| 发表于 2010-11-28 13:42:17 | 只看该作者
回复 苏小脉 的帖子

不会编译 DLL 呢
我是选择了一个空项目的win32dll项目,然后直接添加一个cpp把代码放进去编译,结果。。。
error C2664: “MessageBoxW”: 不能将参数 2 从“const char [23]”转换为“LPCWSTR”
与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

一窍不通,完全不知道该怎么弄呢
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
17
发表于 2010-11-28 14:02:23 | 只看该作者
回复 赛露休斯 的帖子

工程上右键 - 属性 - 配置属性 - 通用 - 字符集 - 设置为不使用字符集。
要么就把所有双引号字符串加上 TEXT(),如  TEXT("Loop loop and loop ...")
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

回复 苏小脉 的帖子

设置了字符集以后运行出现另一个错误
error C4716: “abort_async_api”: 必须返回一个值
是在第16行发生的
最近在研究XAS
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

回复 赛露休斯 的帖子

把 HANDLE WINAPI abort_async_api() 改为 void WINAPI abort_async_api()

这是我写错了,不过由于是编译为 C 代码所以没发现

顺便改一下这个:工程右键属性 - C/C++ - 高级 - 编译为 - C 代码,否则开头两行指定的链接器选项会有问题。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
20
 楼主| 发表于 2010-11-29 03:14:41 | 只看该作者
dll创建成功了,然后测试的时候我把RUBY部分的 sleep 5 换成那个会卡机的API,不知道这样用对不对,它一遍又一遍的弹出"Loop loop and loop ...",没有下文了,未见中止。
另外我这个API在不同环境下可能有无法运行卡死的情况,所以我想如果该API在3秒内没有执行完毕则中止这个API,然后继续执行后面的代码。

最近在研究XAS
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-23 20:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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