乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: gile

Editor.CommandvsEditor.CommandAsync

[复制链接]

0

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
17
发表于 2015-3-24 05:39:12 | 显示全部楼层

问得好。。。
Editor.Command() 调用至 acedCmdS()。这是一个与acedCommandS()略有不同的代码路径,ObjectARX文档说:
“但是,如果你想传入足够的令牌来开始命令但不能完成它,那么acedCommandS就不合适了。当令牌用完时,将取消正在进行的任何命令。部分完成的命令副作用不会回滚。
显然,这不是我们在这里看到的行为,但我的个人本能是避免依赖acedCmdS()完成部分命令(而不是取消它们,如acedCommandS()所记录的那样)。
肯恩
回复

使用道具 举报

0

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
17
发表于 2015-3-24 06:22:09 | 显示全部楼层
我相信ARX文档对于AutoCAD 2015(或者2014)的早期版本是正确的。),但是实现后来发生了变化(大概是因为发现取消命令除了破坏工作代码之外没有任何作用)。
回复

使用道具 举报

0

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
17
发表于 2015-3-24 18:23:01 | 显示全部楼层
谢谢 欧文
我会四处打听,看看我发现了什么。
肯恩
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2015-3-25 02:04:49 | 显示全部楼层
这就是我从中得到的,对于初学者来说,我认为使用Async、wait可能会混淆或给人一些错误的印象,例如与AutoCAD API一起使用Dispose和use语句。他们也没有滥用,但调用Dispose通常与从内存中释放非托管资源有关。API主要处理操作AutoCAD数据库,并且dispose调用用于关闭数据库常驻对象,并且您永远不会实际删除或释放数据库常驻对象的内存。只有创建的对象不会添加到数据库中,然后由AutoCAD处理。也许如果更详细地解释dispose是如何真正调用数据库驻留对象的关闭或取消的,一开始可能会有所帮助。命令Async调用acedcmdC命令调用acedCmdS公共不安全无效命令(params对象[]参数)。
{。
resbuf*resbufPtr=0L;。
尝试。
{。
resbufPtr=(resbuf*)Marshaler.ObjectsToResbuf(参数),ToPointer();。
Interop.CheckAds:。
}。
最后。
{。
如果(resbufPtr!=null)。
{。
acutRelRb(resbufPtr);。
}。
}。
}。


公共不安全命令结果命令Async(params对象[]参数)。
{。
如果(acedFiberWorld())。
{。
Interop.ThrowExceptionForErrorStatus(2);。
}。
resbuf*resbufPtr=0L;。
尝试。
{。
resbufPtr=(resbuf*)Marshaler.ObjectsToResbuf(参数),ToPointer();。
命令结果结果=新命令结果();。
IntPtr ptr=(IntPtr)GCHandle.Alloc(结果);。
Interop.CheckAds(acedCmdC((int modopt(CallConvCdecl)*(ulul*))__unep@? acedCmdCallback@@$$FYAHPEAX@Z,ptr.ToPointer(),(resbuf modopt(IsConst)*)resbufPtr));。
acedCallBackOn取消();。
返回结果;。
}。
最后。
{。
如果(resbufPtr!=null)。
{。
acutRelRb(resbufPtr);。
}。
}。
返回null;。
}。



因此可以快速概述可能的行为acedCmdC vs acedCmdSacedCmdC中的“C”代表协程,acedCmdS中的“S”代表子程序。非常快速的概述子程序在开始时被调用并运行到结束或从返回中退出等...协程被调用,然后退出调用另一个协程,但保存其状态并返回到点并具有多个入口点。协程(语言级别)和纤维(系统级别)协程是语言级别的构造,光纤在2015年贬值AutoCAD使用光纤进行文档切换和命令执行,方法是在线程内交换本机代码调用堆栈没有光纤AutoCAD在其主线程中只有一个代码堆栈。因此,现在通过在堆栈上推送更多代码(子例程样式)或在将消息排队到随后将执行的逻辑后返回调用堆栈来转移控制权(协程样式)。AutoCAD仍然在应用程序上下文和文档上下文的概念下运行,除了现在,要到达应用程序上下文,AutoCAD必须返回逻辑上绑定到文档的函数,而不是执行堆栈切换。我相信Lisp处理器通过保存调用堆栈、处理它、重新调用和恢复等来处理自己......像以前一样工作,我相信有些结果来自如果您查看aced命令迁移上的文档。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-4-30 10:22 , Processed in 0.561891 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表