2度あることは3度あることは無限にある


struct SThraedParam
{
    CKana*  pcThis;
    HANDLE  hEvent; // スレッド起動完了を通知
};


int CKana::Func()
{
    UINT         nThreadID;
    ATL::CEvent  cEvent(false, true, NULL, NULL);
    SThreadParam sParam = { this, cEvent };

    m_hThreadHandle = reinterpret_cast<HANDLE>(
        _beginthreadex(NULL, 0, &CKana::thread_func_static, &sParam, 0, &nThreadID)));

    // イベントがシグナルになるまで待とうぜ!
    if(!WaitThread(cEvent))
    {
        ::TerminateThread(m_cThreadHandle, POP3_Abort);
        return -1;
    }

    return 0;
}


unsigned CALLBACK CKana::thread_func_static(void *ptr)
{
    SThreadParam* p = static_cast<SThreadParam*>(ptr);
    ::SetEvent(p->hEvent);

    // ↓※※ 全力で死亡 ※※ ↓
    const int nResult = p->pcThis->thread_func();

    _endthreadex(nResult);
    return eResult;
}

イベントをシグナルにしてしまった以上、p が生きてる保証なんて何処にも無いですからねー。 呼び出し元の関数が終了しちゃってるかもしれないしぃ〜 orz つか、このミス昔にもやってたはず……成長無ぇーー!!(涙