Как я могу смешать Concurrency Runtime с кодом .NET? - PullRequest
4 голосов
/ 24 августа 2010

Я использовал Concurrency Runtime в статической библиотеке C ++ и недавно хотел использовать эту библиотеку в проекте C ++ / CLI, чтобы воспользоваться конструктором форм Windows и избежать MFC.К сожалению, среда выполнения с параллелизмом несовместима с ключом / clr, необходимым в C ++ / CLI.Я попытался окружить включенные заголовочные файлы, которые используют Concurrency Runtime, в директивах "#pragma unmanaged ... #pragma managed", но, хотя в прошлом это работало для меня с другим кодом, в данном случае это не работает,Под этим я подразумеваю, что получаю ошибку:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\concrt.h(27): fatal error C1189: #error :  ERROR: Concurrency Runtime is not supported when compiling /clr.

Я не очень хорошо разбираюсь в смешивании управляемого и неуправляемого кода, поэтому возможно, что есть обходной путь, о котором я не знаю.Но с другой стороны, возможно, это просто глупый подход.Если бы не тот факт, что я нахожу MFC невероятно сложным, а конструктор форм настолько красивым и легким, я просто сделал бы чистый C ++.С предпочтением смешать два, какие-либо предложения?

Ответы [ 4 ]

7 голосов
/ 16 октября 2010

Использование ConcRT в C ++ / CLI явно отключено в concrt.h с помощью приведенного ниже оператора, поскольку оно официально не поддерживается ...

#if defined(_M_CEE)
   #error ERROR: Concurrency Runtime is not supported when compiling /clr.
#endif

Вы можете использовать PInvoke, чтобы обойти это, как предложено выше, или вы можете также использовать указатель на идиому реализации, чтобы решить эту проблему путем прямого объявления класса 'pimpl' и скрытия зависимости от concrt.h в собственном файле .cpp. который затем можно скомпилировать в lib и связать с заголовочным файлом.

например. в файле .h:

//forward declaration
class PImpl;

class MyClass
{
  ....
  //forward declaration is sufficient because this is a pointer
  PImpl* m_pImpl;
}

например. в вашем файле .cpp, который компилируется в собственную библиотеку:

  #include <ppl.h>
  class PImpl
  {
   //some concrt class
   Concurrency::task_group m_tasks;
  }
0 голосов
/ 27 ноября 2016

Даже если ConcRT в C ++ / CLI явно отключен, вы можете скомпилировать свой проект с поддержкой clr и иметь несколько собственных классов в том же проекте, установив для свойства CompileAsManaged значение false, а для PrecompildHeader значение NotUsing в файле vcxproj (I ').мы проверили это с VS2013):

<ClCompile Include="NativeProcessWithThread.cpp">
  <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
  <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
  <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  </PrecompiledHeaderFile>
  <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
  </PrecompiledHeaderOutputFile>
  <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
  <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
  <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  </PrecompiledHeaderFile>
  <PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
  </PrecompiledHeaderOutputFile>
</ClCompile>

Затем вы можете создать экземпляр этого класса из своего управляемого кода C ++:

NativeProcessWithThread nativeProcess = NativeProcessWithThread();
0 голосов
/ 05 ноября 2010

Я не уверен, насколько детализированы ваши параллельные потребности, но OpenMP отлично работает (т. Е. Вы можете комбинировать опции /clr и /openmp)

array<MyModelResult^>^ model ....;
#pragma omp parallel for
for(int i=0;i<model->Length;i++) {
    model[i] = ComputeModelFor(i);
}
0 голосов
/ 24 августа 2010

Можно подумать о написании управляемого GUI и заставить его вызывать (используя PInvoke) неуправляемую DLL: если вы можете упаковать среду выполнения с параллелизмом и код, который ее использует, в виде DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...