c# - 从 C# wpf 应用程序在 c++ dll 中启动一个线程,我需要一个线程内的线程吗?
问题描述
我有一个 C#/WPF 应用程序,它从 c++ dll 运行函数,并将数据返回到回调中。
为了避免锁定 UI,我在 C# 中启动了一个线程,该线程在 dll 中启动了一个新线程。
C#
Thread threadZ = new Thread(StartTracking);
threadZ.IsBackground = true;
threadZ.Start();
C++
__declspec(dllexport) void StartTracking()
{
std::thread procThread = std::thread([&]() {
m.ttrack->Connect(callback, callbackFrames); });
procThread.join();
}
这似乎是多余的,因为我启动一个线程只是为了启动一个线程。但是如果我不启动一个新的 c# 线程,UI 就会锁定。如果我只是在 c++ 中运行该函数,而不启动新的 c++ 线程,我会看到返回的数据出现奇怪的问题,延迟会上升和下降。在新线程中,它是稳定的。例如,当我启动应用程序时,我的回调数据的延迟是 6 毫秒。当应用程序最小化一段时间,或者我在运行时使用另一个应用程序时,延迟会上升到 800ms 或更多。
我的问题是:
我需要像这样运行线程内线程吗?或者有没有更简单的方法?
解决方案
关于 C# 和 C++ 中线程的使用。请记住,它们将是不同的上下文,因此如果以下问题有肯定的答案,请继续使用它们。
1 - 在您的 WPF 表单中,您是否希望您的用户在例程未完成时执行其他操作(响应性)?
2 - 在 C++ 创建的例程中,由 C# 通过 DLL 使用,是否有其他活动可以与主流并行执行?
至于延迟问题,我建议您稍微改变一下方法。而不是在您使用 C++ 例程 (new Thread(StartTracking)) 时实例化新线程。尝试使用由 .Net 管理的线程池。过去,我已经看到采用这种方法的性能显着提高。
ThreadPool.QueueUserWorkItem((x)=> StartTracking);
推荐阅读
- php - 如何只允许管理员能够使用 laravel 删除/编辑用户信息?
- google-cloud-platform - Google Calendar API:如何避免域内部访客的 403 使用限制?
- javascript - 在 mustachejs 中以未转义的 html 呈现变量
- mongoose - TypeError:无法读取未定义的属性“创建”
- scripting - 如何在 OpenTest 框架中实现拆卸
- python - 使用 Click 在命令行应用程序中对断言进行单元测试
- python - 在 Databricks 中读取 blob 存储中的数据
- geolocation - 最新 CSV 中的 Maxmind 免费 GeopIP 编码问题
- vb.net - 如何将 DataGridView 的一部分复制到剪贴板?
- spring-data-rest - spring-data-rest 一次返回多个投影(组合投影)