Многопоточность с _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.