【发布时间】:2016-12-12 05:06:56
【问题描述】:
我正在编写一个机器人模拟场景。机器人使用 C 语言编程并使用对特殊 API 的调用。
我的计划是将机器人程序编译为 DLL,并在模拟开始时调用该 DLL 的主函数来启动它。
我遇到的问题是 DLL 将如何返回通信。我将在伪代码中给出一个例子
假设机器人程序只是“SetLeftWheelSpeed(100)”然后“Wait(1500)”让它移动左轮,然后等待 1.5 秒。
当我调用机器人的程序时,如何让 SetLeftWheelSpeed(int speed) 与我的模拟器进行通信?我认为 DLL 是你调用方法的工具库,它会给你一个回报。我必须让它循环运行,所以我不能只使用我不认为的返回值。
编辑:
更多的想法使我遇到了一个根本问题。在我给定的示例中,我将无法编译机器人代码,因为它没有诸如移动轮子之类的定义。为此,我必须将其链接到模拟器中的 API。所以也许我必须将 API 链接到机器人代码,将机器人代码链接到模拟器,并以某种方式将模拟器链接到 API,以便它实现它应该做的事情。
【问题讨论】:
-
@pseudoadbul:DLL 将数据推送到 C# 的方法有很多,其中最直接的一种可能是将消息写入 C# 代码正在使用流读取的管道中。这完全取决于 C# 代码是负责设置返回给机器人驱动程序的值,还是只是在观看。
-
谢谢,我会调查的。但是,是的,沟通必须是双向的。
-
你知道如何使用 c# 委托吗?当通过 p/invoke 传递时,它们成为函数指针,允许本机代码对 c# 代码进行回调。请注意,本机代码的回调对垃圾收集器是隐藏的,因此您必须防止委托变得无法访问。
-
我经常使用委托,但所有这些垃圾收集器的东西都让我感到害怕。我可能会考虑在两者之间建立一个数据流。
-
OK 新计划。您有 3 个不同的部分:模拟器(Windows 可执行文件)、机器人代码(一个 dll)和 API(也是一个 dll) 机器人代码链接到 API,因此它可以调用 API 函数。模拟器还有一个指向 API dll 的链接,因此它可以向 API 函数添加委托。这会是一个更好的策略吗?
标签: c# dll simulation