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