0

我是线程和 Winforms/C++ 的新手。当我按下一个按钮时,我想在一个新线程中启动一个函数。我一直在关注这个作为线程教程。当我在一个单独的 VC++ 项目中构建该站点上给出的示例代码时,构建成功

但是,如果我在 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
4

1 回答 1

2

您正在使用托管 C++ (C++/CLR)。这与本机 C++(编写本教程的目的)非常不同。

_beginthread在托管 C++ 中,默认调用约定与本机函数所期望的函数指针的调用约定不兼容。幸运的是,托管 C++ 与本机 C++ 具有非常好的互操作性,将函数声明更改为以下内容应该可以工作:

void __cdecl Test( void *arg )

由于您使用的是托管 C++,因此您拥有 .NET 的全部功能,并且可以创建托管线程(例如,使用Task对象)。

另请注意,在主线程上创建的任何 win32 UI 对象只能在该线程上访问——所以要小心!:-)

于 2013-02-20T04:53:48.450 回答