簡體   English   中英

在 c++ dll 中啟動一個線程,從一個 C# wpf 開始一個線程,內部需要一個線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM