[英]Starting a thread in a c++ dll, from a C# wpf application, do I need a thread inside a thread?
我有一個 C# / WPF 應用程序,它運行來自 c++ Z06416233FE5EC4C591Z,AF4AB24 的函數並返回數據。
為了避免鎖定 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++ 中運行 function,而不啟動新的 c++ 線程,我會看到返回的數據出現奇怪的問題,延遲會上升和下降。 在新線程中,它是穩定的。 例如,當我啟動應用程序時,我的回調數據的延遲是 6 毫秒。 當應用程序最小化一段時間,或者我在運行時使用另一個應用程序時,延遲會上升到 800ms 或更多。
我的問題是:
我需要像這樣運行線程內線程嗎? 或者有沒有更簡單的方法?
關於 C # 和 C ++ 中的螺紋使用。 請記住,它們將是不同的上下文,因此如果以下問題有肯定的答案,請繼續使用它們。
1 - 在您的 WPF 表單中,您是否希望您的用戶在例程未完成時執行其他操作(響應性)?
2 - 在 C ++ 中創建的例程中,由 C # 通過 DLL 消耗,是否還有其他活動可以與主流並行執行?
至於延遲問題,我建議您稍微改變一下方法。 而不是在您使用 C ++ 例程(新線程(StartTracking))時實例化新線程。 嘗試使用由 .Net 管理的線程池。 過去,我已經看到采用這種方法的性能顯着提高。
ThreadPool.QueueUserWorkItem((x)=> StartTracking);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.