【发布时间】:2010-06-05 04:17:40
【问题描述】:
我需要创建一个 C++/CLI 混合程序集,该程序集可以将未来的调用安排到本机 DLL 中,精确到毫秒。
当然,这意味着提前设置一个计时器(什么类型的?)一到三毫秒,然后一直旋转到这一刻并调用本机 DLL 函数。
根据我读到的内容,我猜想定时器调用的回调需要是原生的,以确保没有 thunk 或 GC 来延迟处理定时器回调。
整个线程或进程是否需要是本机和无 CLR 的,或者这可以通过 #pragma unmanaged 或将程序集的一个文件设置为本机编译一样准确地完成吗?
如果有,怎么做?
如果确实无法在混合模式 C++/CLI 中执行此操作,那么设置应用程序/线程(即 DLL 或 exe?)来处理它并取回数据的最简单方法是什么在本机和托管线程/应用程序之间来回切换?
【问题讨论】:
-
有结构体、联合体、帕斯卡字符串、任意长度的缓冲区等来回传递给专有的本机 DLL,因此需要在临界区之外进行一些重组为更健全的数据类型(s) 在 C++/CLI 或本机 C++ 中尝试使用 .NET 军事 API。
-
我希望它能让我也添加“windows”和“callback”作为标签。 (其他建议?)
-
您知道,在抢占式多任务操作系统上,无论线程是在运行本机代码还是托管代码,您都无法保证代码在回调触发之前不会被中断。
-
JS Bangs 的陈述总体上是完全错误的,并且在 Windows 上大多是错误的。在许多抢先式多任务操作系统上,线程永远不会被较低优先级的线程中断(由于中断处理导致的延迟比 1 毫秒快得多)。在 Windows 上,如果内核检测到优先级反转的迹象,那么它会临时随机更改优先级以恢复,但如果您使用实时优先级,您的线程应该仍然不受此影响。
-
谢谢你,本。还有其他人对我有一些实施最佳实践吗?我还不知道从 .NET Winforms GUI 控制时有什么方法可以实现这一点。如何让 .NET 完全避开响应 1 毫秒早期计时器、旋转到正确的微秒并进行本机 DLL 调用的部分?我如何 IPC/互操作到该 Native 位?请提供最佳实践。 :)
标签: .net multithreading interop c++-cli timer