2013-03-03 48 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() 
{ 
} 

希望它可以帮助任何人。