2012-06-28 37 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國家統計局。此選項的項目屬性對話框中有一個條目。 –