首页 > 解决方案 > 从 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++multithreading

解决方案


关于 C# 和 C++ 中线程的使用。请记住,它们将是不同的上下文,因此如果以下问题有肯定的答案,请继续使用它们。

1 - 在您的 WPF 表单中,您是否希望您的用户在例程未完成时执行其他操作(响应性)?

2 - 在 C++ 创建的例程中,由 C# 通过 DLL 使用,是否有其他活动可以与主流并行执行?

至于延迟问题,我建议您稍微改变一下方法。而不是在您使用 C++ 例程 (new Thread(StartTracking)) 时实例化新线程。尝试使用由 .Net 管理的线程池。过去,我已经看到采用这种方法的性能显着提高。

ThreadPool.QueueUserWorkItem((x)=> StartTracking);

推荐阅读