Может быть, старый вопрос, но я изучил эту проблему раньше. Поскольку 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()
{
}
Надеюсь, это может помочь кому угодно.
Ошибка, по-видимому, указывает на то, что '' не поддерживается в среде CLR: '#error директива: ERROR: Concurrency Runtime не поддерживается при компиляции/clr.' .NET тоже имеет потоки. –
chris
Да, вот почему я ищу альтернативу. – JMRC
Просто не компилируйте собственный код C++ с/clr. Точка использования C++/CLI заключается в том, что он может делать оба. –