2012-06-28 40 views
0

我在使用在Microsoft Visual Studio C++ 10所明示_beginthread一个问题: 我的代码:多线程在C _beginthread ++/CLI

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':用/ clr:pure或/ clr编译的函数的无效调用约定'__cdecl':安全

错误C2664:'beginthread':无法将参数1从'void( _cdecl *)(无效*)”到 '无效(__cdecl *)(无效*)'

+3

您似乎在使用C++/CLI。为什么不使用System.Threading框架中的类来执行多线程工作? –

回答

1

从看来你是用/clr:pure/clr:safe编译项目的compiler error(在这种情况下,你是不是在C++编程,但C++/CLI的方式),因此不能使用__cdecl调用约定,而这又是由_beginthread所要求的。

如果在C++/CLI编程(因而.NET),无论如何,那么为什么不使用.NET的线程,而不是设施的怪伪标准Win32的包装_beginthread

如果你想使用C++/CLI,但仍然能够使用好老_beginthread,然后尝试只用/clr代替/clr:pure,允许非管理功能,可以有__cdecl调用约定进行编译。

+0

什么更容易的线程方法在.NET中? – Luke

+0

@ user1100671不知道,我没有太多的.NET经验。但我很确定这个大框架有一些很好用的面向对象的线程组件,它至少更适合于其他代码(当然,你不能用.NET编程,然后使用一些“丑陋的, OOP“免费功能;))。或者这是一个反复的问题? –

1

尝试使用/ clr而非/ CLR以打造专业化的程序:纯。

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

+1

或更好,或者不要用/ clr来构建它,或者使用CLR的线程工具 – jalf

+0

msv表示我不能编辑compilator的命令行;/ 当我试图添加/ clr作为附加选项时Memory.obj:错误LNK2005:“void __cdecl DashThread(void *)”(?DashThread @@ $$ FYAXPAX @ Z)已经在General.obj中定义了 1> Memory。 obj:错误LNK2005:“void __cdecl DashThread(void *)”(?DashThread @@ YAXPAX @ Z)已经在General.obj中定义了 1> tb.obj:error LNK2005:“void __cdecl DashThread(void *)” DashThread @@ $$ FYAXPAX @ Z)已在General.obj中定义 1> tb.obj:错误LNK2005:“void __cdecl DashThread(void *)”(?DashThread @@ YAXPAX @ Z)已经... – Luke

+0

@ user1100671您不需要更改编译器命令l国家统计局。此选项的项目属性对话框中有一个条目。 –