1

クラスに新しいスレッドを作成したい。問題は、新しいスレッドで使用される関数へのポインターを渡す必要がある場合です。関数にポインターを渡すことができません。ボンネットの下のクラス関数は、基本的にこれですよね?

void foo (this);

では、なぜこのコードはコンパイルを拒否するのでしょうか?

class TimeClass
{
private:
    DWORD   dwThreadId;
    HANDLE  hThread;

    LPTHREAD_START_ROUTINE Timer ();
public:
    TimeClass ();
};

TimeClass::TimeClass ()
{
    dwThreadId = CreateThread (NULL, 0, Timer, this, 0, &dwThreadId);
}
4

3 に答える 3

2

スレッド関数の署名は、

DWORD WINAPI ThreadProc(LPVOID param);

通常の (つまり非静的な) C++ メンバ関数には WINAPI 呼び出し規約がないため、スレッド関数として使用できません。メンバー関数を static として宣言すると、スレッド関数として使用できます。

static DWORD WINAPI ThreadProc(LPVOID param);
于 2013-10-06T13:18:36.803 に答える
1

ボンネットの下のクラス関数は基本的にこれですよね?

void foo (これ);

一般的に、いいえ。それはコンパイラーが決定したものであり、あらゆる種類の「非仮想サンク」、インラインなどがある可能性があります。コンパイラーは、プログラムの動作を変更しない方法でプログラムを最適化することが許可されています。実装の詳細は標準では定義されていません。そのため、あなたがやろうとしているのは UB であり、ここでの最善の策 (IMHO) は次のようになります。

extern "C" wrapper(void * p)
{
    static_cast<TimeClass*>(p)->whatever();
}
于 2013-10-06T08:39:53.693 に答える
0

ThreadProc()原型は

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

Timer()したがって、宣言を次のように変更する必要があります。

DWORD WINAPI Timer()
于 2013-10-06T08:39:23.567 に答える