2013-02-20 50 views
0

我是新來的線程和Winforms/C++。當我按下按鈕時,我想在新線程中啓動一個函數。我正在關注這個線程爲tutorial。當我在單獨的VC++項目中構建在該站點上給出的示例代碼時,構建成功C++/Winforms線程:_beginthread出現構建錯誤

但是,如果我在我的C++/Winforms中執行以下操作,則生成將無法完成,我收到編譯錯誤

我在這裏錯過了什麼?

幫助!

代碼:

void Test(void *arg); 
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
        _beginthread(Test, 0, (void*)12); 
     } 
void Test(void *arg) 
{ 
    // Do something 
} 

生成錯誤:

Error 1 error C2664: '_beginthread' : cannot convert parameter 1 from 'void (__clrcall *)(void *)' to 'void (__cdecl *)(void *)' c:\users\documents\visual studio 2010\projects\statsv2.0\statsv2.0\Form1.h 659 1 StatsV2.0 

回答

2

你使用管理C++(C++/CLR)。這與本機C++(本教程是爲此編寫的)非常不同。

在託管C++中,默認調用約定與本機_beginthread函數所期望的函數指針調用約定不兼容。幸運的是,託管C++與本地C++很好的互操作,並改變你的函數聲明下面應該工作:

void __cdecl Test(void *arg) 

由於您使用的託管C++,你有.NET的全部力量就在你身邊,並可以改爲創建託管線程(例如使用Task對象)。

還要注意,在主線程上創建的任何win32 UI對象必須在該線程上訪問只有 - 所以要小心! :-)

+0

感謝您的快速回復:-)。如果我改變你的建議,我仍然得到一個構建錯誤,如下所示:錯誤1錯誤C2062:輸入'void'意外。指向測試函數原型。 – HaggarTheHorrible 2013-02-20 05:01:56

+0

@Haggar:哎呀,我似乎已經把調用約定放在了錯誤的地方!您還可以將函數放在'#pragma unmanaged' ...'#pragma managed'中。 – Cameron 2013-02-20 05:04:52

+0

我這樣做的#pragma非託管 __cdecl無效測試(無效* ARG) { \t //做一些事情 } 的#pragma管理。但我仍然得到:輸入'void'意外。 – HaggarTheHorrible 2013-02-20 05:11:33