如何使用 p/invoke 终止从 C# 调用的 C++ 函数
Posted
技术标签:
【中文标题】如何使用 p/invoke 终止从 C# 调用的 C++ 函数【英文标题】:How to Terminate a C++ Function Called form C# Using p/invoke 【发布时间】:2015-08-07 21:10:57 【问题描述】:我正在使用 p/invoke 从 C# 调用 C++ 函数,该函数有一个无限循环(将帧捕获到文件中),当 C# 中发生事件时应该将其中断。
我怎样才能打破那个循环(终止那个函数)?
我尝试在 C# 的线程中运行此函数,并在需要终止时中止该线程。 但中止功能不起作用。
Thread thread = new Thread(myMethod);
thread.Start();
// to terminate the function
thread.Abort(); //didn't respond
【问题讨论】:
能不能修改C++函数,还是不能控制? 我可以修改它。基本上它会录制视频,直到用户在 C# GUI 中点击“停止录制”。 【参考方案1】:可能最安全的方法是做两件事:
-
公开另一个名为(例如)
StopRecording
的函数,该函数在您的本机代码中设置一个全局变量
在您的 main 函数中,在每次循环迭代开始时检查全局值,以查看是否已调用 StopRecording
(如果是,则退出循环)
这让它自然终止,而不需要任何严厉的终止。
【讨论】:
取消回调会更好 这是另一个不错的选择,但对于像这样的简单案例来说,可能比必要的复杂。除了 P/Invoke 签名之外,请求将在事件处理程序被调用时停止。 其实恰恰相反。您的方法更复杂,因为它强制使用第二个线程,或者类似于 VB 的DoEvents
。回调可以避免所有这些。
代码运行无限循环,无论如何都不能在UI线程上运行。回调解决方案也需要两个线程。
在这两种情况下都有两个线程 - UI 线程(必须保持响应,以便根据问题的要求接收输入事件以停止处理)和运行帧捕获的线程.以上是关于如何使用 p/invoke 终止从 C# 调用的 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章
通过 P/Invoke 将 MFC CArray 编组为 C#
如何在没有 P/Invoke 的情况下从 c# 创建挂起的进程?
我应该如何使用 P/Invoke 将字符串数组传递给 C 库?