1

ヘッダー ファイルにあるスレッドを定義するには:

class HttpClient
{
public:
    ...
    unsigned int __stdcall  PerformLogin(void*);
    ...

};

次に、私のcppファイルには次のものがあります。

unsigned int __stdcall PerformLogin(void*){
...
}

そして、私が使用するこのスレッドを呼び出すために

hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, NULL, 0, &threadID );

しかし、私は次のことを&PerformLogin言っていることに誤りがあります:

タイプ unsigned int (__stdcall HttpClient:: )(void ) の引数は、パラメーター unsigned int (__stdcall*)(void*) と互換性がありません。

エラーは理解できますが、これを修正する方法が本当にわかりません!

4

3 に答える 3

2

これを修正する可能な方法は、メンバー関数を作成することstaticですが、これはポインターをPerformLogin()持たずthis、の非静的メンバーにアクセスできないことを意味しますHttpClient

もう1つは、完全に移動PerformLogin()して、無料の機能にすることです。HttpClient

于 2012-07-02T08:09:51.183 に答える
2

私が通常行うことは、「this」を void* パラメーターとして静的関数に追加することです。その後、少しキャストすることで、静的関数でメソッドを呼び出すことができます..

于 2012-07-02T08:40:03.743 に答える
0

メンバー関数はthis、最初のパラメーターとして暗黙的にポインターを取得します。したがって、クラスメンバー関数を使用してスレッドを開始する場合は、への呼び出しでクラスインスタンスへのポインターを明示的に渡す必要があります_beginthreadex

したがって、明示的な引数を削除します。

class HttpClient
{
    public:
    ...
    unsigned int __stdcall  PerformLogin();
    ...
};

そして、引数として_beginthreadex渡しながら呼び出します:this

hThread = (HANDLE)_beginthreadex( NULL, 0, &PerformLogin, this, 0, &threadID );

これは少しハッキーだということは言及する価値があります。C++FAQはそれに対してアドバイスします。私はまだこのアプローチを好みます。もちろんboost::thread普段使っています。

于 2012-07-02T10:22:24.143 に答える