1

ヘッダー ファイル:

// Free function to use in thread
unsigned int __stdcall WorkerFunction(void *);

class MyClass {
    public:
        int temp;
        void StartThread();
}

typedef struct {
    MyClass * cls;
} DATA;

CPP クラス:

void MyClass::StartThread() {
    temp = 1234;
    DATA data = {this};

    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, &data, 0, 0);

    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}

unsigned int __stdcall WorkerFunction(void * param0) {
    MessageBox(NULL, "WorkerFunction()", "Alert", MB_OK);
    DATA * data = (DATA *) param0;
    MyClass* cls0 = data->cls;

    // Crashes when reference to cls0 is attempted.
    char buf[5];
    snprintf(buf, 5, "%i", cls0 ->temp);
    MessageBox(NULL, buf, "Alert", MB_OK);
}

ここには、指を置くことができない簡単な問題があります。

  • クラスを含む構造体を渡すスレッドのパラメーターがあります。
  • 構造体をインスタンス化しthis、スレッドの開始時に渡します
  • ワーカー関数で逆参照 (?) しようとしています。
  • この時点で、すべてが正常にコンパイルされます。
  • クラス内の何かにアクセスする行を追加すると、アプリがクラッシュします。

私の間違いはどこですか?

4

1 に答える 1

1

返された瞬間にスコープ外のローカル スタック変数を渡していStartThread()ます。したがって、もはや自分のものではないスタック空間を参照しています。

void MyClass::StartThread() {
    temp = 1234;
    DATA data = {this}; // << LOCAL VARIABLE OUT OF SCOPE ON FUNCTION EXIT

    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, &data, 0, 0);

    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}

データを動的に割り当てるか、データをメンバーにしてスレッド データとしてMyClass渡すことをお勧めします。thisあなたの場合、構造体を介して* thisを渡すだけなので、paramとして渡すだけです

void MyClass::StartThread() {
    temp = 1234;

    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, this, 0, 0);

    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}

そして、あなたのスレッド proc で:

unsigned int __stdcall WorkerFunction(void * param0) {
    MessageBox(NULL, "WorkerFunction()", "Alert", MB_OK);
    MyClass* cls0 = static_cast<MyClass*>(param0);

   etc...
}

スレッド プロシージャに渡すものは、必要な期間有効な有効期間を持つ必要があります。スレッドによって。動的割り当ての所有権をスレッドに渡して削除を実行させる、スレッドプロシージャでの使用の存続期間中、確定状態を保持することがわかっているポインターを渡します。後者を満たしているように見えるthisので、おそらく大丈夫でしょう。

于 2012-11-22T05:32:48.033 に答える