我正在爲桌面創建UI抽象層。現在我正在實現.NET框架的功能。令人討厭的是,如果我讓用戶在Visual Studio中創建CLR Windows窗體應用程序,他們不能使用像std::thread
這樣的所有標準庫,如果我讓他們創建另一種類型的應用程序,控制檯就會顯示出來。使用clr和std ::線程
是否有使用CLR與std::thread
,或者甚至更好的方式,是有辦法,以防止啓動控制檯(或從屏幕和任務欄都隱藏)與CLR控制檯或CLR空項目。
感謝
我正在爲桌面創建UI抽象層。現在我正在實現.NET框架的功能。令人討厭的是,如果我讓用戶在Visual Studio中創建CLR Windows窗體應用程序,他們不能使用像std::thread
這樣的所有標準庫,如果我讓他們創建另一種類型的應用程序,控制檯就會顯示出來。使用clr和std ::線程
是否有使用CLR與std::thread
,或者甚至更好的方式,是有辦法,以防止啓動控制檯(或從屏幕和任務欄都隱藏)與CLR控制檯或CLR空項目。
感謝
這是一個老問題,但萬一有人打了同樣的問題:boost::thread
是「物美價廉」,實用的更換(只要你能在項目中使用升壓)。奇怪的是,它繞過了不兼容。
可能是一個古老的問題,但我看過這個同樣的問題。由於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()
{
}
希望它可以幫助任何人。
錯誤似乎強烈暗示''在CLR中不受支持:'#error指令:錯誤:編譯/ clr時並不支持併發運行時。「.NET也具有線程功能。 –
chris
2013-03-03 18:13:00
是的,這就是我尋找替代品的原因。 – JMRC 2013-03-03 18:28:56
只要不使用/ clr編譯本機C++代碼即可。使用C++/CLI的要點是它可以兼得。 – 2013-03-03 20:55:55