こんなコードを書いたのはいいのですが落ちてしまいます。
// この関数からスタート
int CHoge::MyCreateThread(HWND hWnd)
{
SStartupParam sParam = { hWnd, this }
_beginthreadex(&ThreadStartFunc, &sParam); // 引数の順番忘れた。(ぉ
return 0;
}
unsigned CHoe::ThreadStartFunc(void* pVoid)
{
SStartupParam* psParam = reinterpret_cast<SStartupParam*>(pVoid);
// ごにょごにょ
// でもココで落ちる
psParam->m_pcThis->HogeFunc(psParam->hWnd);
_endthreadex(0);
return 0;
}
なんでだ〜…?? と、ちょっと悩んだんですが、冷静になってみれば落ちるのは当たり前ですねコレ。
_beginthreadex()
したとしても、その瞬間からスレッドが動くわけない -> 親スレッドがある程度動いてから子スレッドに制御が移る -> 親スレッドが MyCreateThread()
を抜けた後に、子スレッドが走る可能性が十分に考えられる -> sParam は破棄されているわけだから pVoid は不正なアドレスを指す orz
夜中に10分ぐらい悩んでしまったッス。