Многопоточность с _beginthread в C++/CLI

У меня проблема с _beginthread в Microsoft Visual Studio C++ 10 Express: мой код:

void __cdecl DashThread( void * Args ) // function without any class refs
{
    while(1){
        MessageBox::Show("work");
        Sleep(5000);
    }
    _endthread();
}

private:
    System::Void button8_Click_1(System::Object^  sender, System::EventArgs^  e) {
        HANDLE HDash = ( HANDLE ) _beginthread(DashThread, 0, NULL );
    }

и ошибки:

ошибка C3641: "DashThread": недопустимое соглашение о вызовах "__cdecl" для функции, скомпилированной с /clr:pure или /clr:safe

ошибка C2664: "beginthread": невозможно преобразовать параметр 1 из "void (_cdecl *) (void *)" в "void (__cdecl *) (void *)"

2 ответа

Решение

Из-за ошибки компилятора кажется, что вы компилируете свой проект с /clr:pure или же /clr:safe (в этом случае вы программируете не на C++, а на C++/CLI) и, следовательно, не можете использовать __cdecl соглашение о вызовах, которое в свою очередь требуется _beginthread,

Если вы все равно программируете на C++/CLI (и, следовательно, на.NET), то почему бы просто не использовать средства потоков.NET вместо странной псевдостандарной Win32-оболочки _beginthread?

Если вы хотите использовать C++/CLI, но все же сможете использовать старый добрый _beginthread, а затем попробуйте скомпилировать его просто /clr вместо /clr:pure, который позволяет неуправляемые функции, которые могут иметь __cdecl Соглашение о вызовах.

Попробуйте создать свою программу с /clr вместо /clr:pure.

См. http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx

Другие вопросы по тегам