1

静的メンバー関数のスレッドルーチンを作成するにはどうすればよいですか

class Blah
{
    static void WINAPI Start();
};

// .. 
// ...
// ....

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);

これにより、次のエラーが発生します。

***error C2664: '_beginthreadex' : cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'***

私は何が間違っているのですか?

4

5 に答える 5

16

時々、あなたが得ているエラーを読むことが役に立つことがあります。

cannot convert parameter 3 from 'void (void)' to 'unsigned int (__stdcall *)(void *)'

それが何を言っているか見てみましょう。パラメーター3の場合、シグニチャーを持つ関数void(void)、つまり引数をとらず、何も返さない関数を指定します。これをに変換できませんunsigned int (__stdcall *)(void *)。これは次のことを_beginthreadex 期待しています。

次のような関数が必要です。

  • を返しますunsigned int
  • stdcall呼び出し規約を使用します
  • 議論をしvoid*ます。

したがって、私の提案は、「要求している署名を使用して関数を提供する」ことです。

class Blah
{
    static unsigned int __stdcall Start(void*);
};
于 2009-08-11T12:37:10.660 に答える
3
class Blah
{
    static unsigned int __stdcall Start(void*); // void* should be here, because _beginthreadex requires it.
};

に渡されるルーチンは、呼び出し規約を_beginthreadex使用する必要があり、スレッドの終了コードを返す必要があります__stdcall

Blah :: Startの実装:

unsigned int __stdcall Blah::Start(void*)
{
  // ... some code

  return 0; // some exit code. 0 will be OK.
}

コードの後半で、次のいずれかを記述できます。

hThread = (HANDLE)_beginthreadex(NULL, 0, CBlah::Start, NULL, NULL, NULL);
// or
hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);

最初のケースFunction-to-pointer conversionでは、C++標準4.3/1に従って適用されます。2番目のケースでは、暗黙的に関数へのポインターを渡します。

于 2009-08-11T12:09:10.237 に答える
2
class Blah
{
  public:
    static DWORD WINAPI Start(void * args);
};
于 2009-08-11T12:11:31.450 に答える
2

コンパイルバージョンは次のとおりです。

class CBlah
{
public:
    static unsigned int WINAPI Start(void*)
    {
    return 0;
    }
};

int main()
{
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &CBlah::Start, NULL, NULL, NULL);

    return 0;
}

必要な変更は次のとおりです。

(1)。Start()関数はunsignedintを返す必要があります

(2)。パラメータとしてvoid*を使用する必要があります。

編集

コメントごとに削除されたポイント(3)

于 2009-08-11T12:17:02.107 に答える
1
class Blah
{
    static unsigned int __stdcall Start(void *);
};
于 2009-08-11T11:39:57.927 に答える