簡體   English   中英

如何制作托管(clr)多線程c ++ .dll?

[英]How to make a managed (clr) multithreaded c++ .dll?

我試圖在c ++中創建一個需要支持多線程的托管.dll。 我正在使用平台工具集版本v120在visual Studio 2013中進行開發。 我需要將其作為托管程序集的原因是因為需要在LabView中集成程序集。

按照在VC ++ 2010創建和使用托管程序集中的步驟, 可以獲得良好的結果。 但我顯然需要實現更復雜的東西,當我包含線程並編寫以下代碼時:

#pragma once
#include <thread>

using namespace System;
using namespace std;


namespace MultiThread_module {

    public ref class multiThreadingTest
    {
    public:
        String^ GetVersion();
        int someNumber;

    private:

        thread testThread;
    };
}

我收到以下錯誤:

使用/ clr或/ clr:pure進行編譯時,不支持“thread”。

托管類的成員不能是非托管類類型

錯誤指令:錯誤:編譯/ clr時不支持並發運行時。

錯誤指令:使用/ clr或/ clr:pure進行編譯時不支持。

我的一位朋友說,如果不使用像boost這樣的外部軟件包,就不可能在Visual Studio中編寫多線程代碼。 這似乎不太可能,因為多線程已經在C#和VB已經存在很長時間了!

所以,如果你能讓我知道我做錯了什么, 或者如果用c ++開發的托管多線程.dll真的很難,我會​​很高興的嗎?

您可以使用托管線程庫: System.Threading.Thread

#pragma once

using namespace System;
using namespace std;
using namespace System::Threading;


namespace MultiThread_module {

    public ref class multiThreadingTest
    {
    public:
        String^ GetVersion();
        int someNumber;

    private:

        Thread^ testThread;
    };
}

如果它純粹是CLR,那么我建議您使用之前提供的示例。 如果你想讓線程完全是原生的並且只是使用CLR來包裝它,我想引用你的回答: 使用clr和std :: thread

可能是一個老問題,但我之前研究過同樣的問題。 由於CLR不允許您在編譯時包含std :: thead ,因此您可以嘗試僅在鏈接時使用它。 通常你可以解決這個問題,在你的標題中聲明類,並將它們僅包含在你的cpp文件中。 但是,您可以在頭文件中轉發聲明自己的類,但不能用於名稱空間std中的類。 根據C ++ 11標准,17.6.4.2.1:

如果C ++程序向命名空間std或命名空間std中的命名空間添加聲明或定義,則它是未定義的,除非另有說明。

此問題的解決方法是創建一個繼承自std :: thread的線程類,您可以轉發聲明。 此類的頭文件如下所示:

 #pragma once #include <thread> #include <utility> namespace Threading { class Thread : std::thread { public: template<class _Fn, class... _Args> Thread(_Fn fn, _Args... args) : std::thread(fn, std::forward<_Args...>(args...)) { } private: }; } 

在您想要使用線程的頭文件中,您可以向前聲明它,如:

 #pragma once // Forward declare the thread class namespace Threading { class Thread; } class ExampleClass { public: ExampleClass(); void ThreadMethod(); private: Threading::Thread * _thread; }; 

在源文件中,您可以使用theading類,如:

 #include "ExampleClass.h" #include "Thread.h" ExampleClass::ExampleClass() : { _thread = new Threading::Thread(&ExampleClass::ThreadMethod, this); } void ExampleClass::ThreadMethod() { } 

希望它可以幫助任何人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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