none
スレッドのポインターをクリアできない RRS feed

  • 質問


  • 下記のような関数を作成して、ワーカースレッドを走らせ、
    処理が終了するまで待ってスレッドを削除しているのですが
    なぜかポインターをクリアできない場合があります。

    スレッドで処理する内容によって、そのようなことがあるのでしょうか?
    もしあれば、どんな処理の場合か教えてください。

    下記の関数が、単にどこか間違っていれば、それを直して解決したいですが。

    環境:
    ・ Win XP Pro SP2 (32bit)
    ・ VS2005 Pro SP1
    ・ MFC

    Code Snippet

    ::CWinThread* beginThread( ::AFX_THREADPROC ThreadProcPtr, LPVOID Param )
    {
        ::CWinThread* thPtr = ::AfxBeginThread( ThreadProcPtr, Param, 0, 0U, CREATE_SUSPENDED );
        thPtr->m_bAutoDelete = FALSE;
        thPtr->ResumeThread();
        return thPtr;
    }


    DWORD endThread( ::CWinThread* ThreadPtr )
    {
        DWORD ret = 0;

        if( ThreadPtr != NULL )
        {
            ::WaitForSingleObject( ThreadPtr->m_hThread, INFINITE );
            ::GetExitCodeThread( ThreadPtr->m_hThread, &ret );
            delete ThreadPtr;
            ThreadPtr = NULL;
        }

        _tprintf( _T( "0x%08p --> " ), ThreadPtr );
        ASSERT( ThreadPtr == NULL );  // 常にOK
        return ret;
    }



    void hogehoge()

    {

        ::CWinThread* p = NULL;

        // ・・・


        p = beginThread( enterFuncThread, &args );

        // ・・・


        _tprintf( _T( "Thread Pointer : 0x%08p --> " ), p );
        endThread( p );
        _tprintf( _T( "0x%08p\n" ), p );
        ASSERT( p == NULL );  // なぜかひっかかる
    }




    ダメな処理結果:
    -----------------------------------------------------------------------------------------------------------
    Thread Pointer : 0x003AE5E8 --> 0x00000000 --> 0x003AE5E8
    -----------------------------------------------------------------------------------------------------------
    2008年5月20日 10:03

回答


  • あ、・・・
    p->m_hThread = NULL;
    でした。

    すみません、解決です。


    追記:
    上に書いたことは、スレッドが動いているかどうかの判定などで
    pとp->m_hThreadの使い間違いなど、勘違いしている部分が
    たくさんあったという意味です。
    2008年5月20日 10:14