2013-03-03 3 views
0

Я создаю слой абстракции пользовательского интерфейса для настольных компьютеров. Теперь я реализую функциональность платформы .NET. Досадно, что если я позволю пользователям создать приложение Visual CRE для CLR в Visual Studio, они не смогут использовать все стандартные библиотеки, такие как std::thread, и если я позволю им создать другой тип приложения, появится консоль.using clr и std :: thread

Есть ли способ использовать CLR с std::thread или, что еще лучше, есть способ предотвратить консоли от запуска (или скрыть его от обоих экрана и панели задач) с CLR консоли или CLR Пустой проект ,

Благодаря

+0

Ошибка, по-видимому, указывает на то, что '' не поддерживается в среде CLR: '#error директива: ERROR: Concurrency Runtime не поддерживается при компиляции/clr.' .NET тоже имеет потоки. – chris

+0

Да, вот почему я ищу альтернативу. – JMRC

+0

Просто не компилируйте собственный код C++ с/clr. Точка использования C++/CLI заключается в том, что он может делать оба. –

ответ

0

Это старый вопрос, но в случае, если кто-то попадет ту же проблема: boost::thread является «доступной» и практичной заменой (при условии, вы можете использовать импульс в вашем проекте). Как ни странно, он обходит несовместимость.

0

Может быть, старый вопрос, но я изучил эту проблему раньше. Поскольку CLR не позволяет включать std::thead во время компиляции, вы можете попытаться использовать его только во время компоновки. Обычно вы можете разрешить это, чтобы объявить класс в своем заголовке и включить их только в ваши файлы cpp. Однако вы можете переслать свои собственные классы в заголовочных файлах, но вы не можете для классов в пространстве имен std. Согласно стандарту 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() 
{ 
} 

Надеюсь, это может помочь кому угодно.

Смежные вопросы