2013-03-03 120 views
0

我正在爲桌面創建UI抽象層。現在我正在實現.NET框架的功能。令人討厭的是,如果我讓用戶在Visual Studio中創建CLR Windows窗體應用程序,他們不能使用像std::thread這樣的所有標準庫,如果我讓他們創建另一種類型的應用程序,控制檯就會顯示出來。使用clr和std ::線程

是否有使用CLRstd::thread,或者甚至更好的方式,是有辦法,以防止啓動控制檯(或從屏幕和任務欄都隱藏)與CLR控制檯或CLR空項目。

感謝

+0

錯誤似乎強烈暗示''在CLR中不受支持:'#error指令:錯誤:編譯/ clr時並不支持併發運行時。「.NET也具有線程功能。 – chris 2013-03-03 18:13:00

+0

是的,這就是我尋找替代品的原因。 – JMRC 2013-03-03 18:28:56

+0

只要不使用/ clr編譯本機C++代碼即可。使用C++/CLI的要點是它可以兼得。 – 2013-03-03 20:55:55

回答

0

這是一個老問題,但萬一有人打了同樣的問題:boost::thread是「物美價廉」,實用的更換(只要你能在項目中使用升壓)。奇怪的是,它繞過了不兼容。

0

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

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified.

此問題的解決方法是創建一個從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; 
}; 

在你的源文件就可以瞭然後使用上述類:

#include "ExampleClass.h" 
#include "Thread.h" 

ExampleClass::ExampleClass() : 
{ 
    _thread = new Threading::Thread(&ExampleClass::ThreadMethod, this); 
} 

void ExampleClass::ThreadMethod() 
{ 
} 

希望它可以幫助任何人。