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++ (チュートリアルが書かれている) とは大きく異なります。

マネージ C++ では、既定の呼び出し規則は、ネイティブ関数が想定している関数ポインターの呼び出し規則と互換性がありません_beginthread。幸いなことに、マネージ C++ はネイティブ C++ と非常に優れた相互運用性を備えているため、関数宣言を次のように変更するとうまくいくはずです。

void __cdecl Test( void *arg )

マネージド C++ を使用しているため、.NET の全機能を利用でき、代わりにマネージド スレッドを作成できます (たとえば、Taskオブジェクトを使用)。

また、メイン スレッドで作成された win32 UI オブジェクトは、そのスレッドでのみアクセスする必要があることに注意してください。:-)

于 2013-02-20T04:53:48.450 に答える