做了一个单文档的程序,其中又创建了一个线程来侦听网口数据,如果收到数据,通过SetWindowText()显示。但是我有时候(不是每次)退出程序时SetWindowText()会出错,提示对象指针为0;
UINT CEPTestView::ListenThread(LPVOID pParam)
{
...
SetWindowText();
...
}
我已经在SetWindowText()之前通过
if (this->m_hWnd == NULL) 
return;
做了控制,但是还是有问题。
而且我也在析构函数中加入WaitForSingleObject(m_pListenThread->m_hThread,INFINITE);也不能完全解决问题。所以我估计是程序先销毁了对象,后结束的线程。但我不知道怎样先结束线程,延时后再结束程序。
也就是当我们点击×关掉程序时,程序是怎样一个析构过程。谢谢大家帮忙!

解决方案 »

  1.   

    if(IsWindow(hwnd))
    {
        SetWindowText();
    }
      

  2.   

    if (this->m_hWnd == NULL) 
    return;

    if(IsWindow(hwnd))
    {
        SetWindowText();
    }有什么区别吗?谢谢
      

  3.   

    我希望在×掉程序时先退出自己的线程,然后sleep(10),最后在销毁窗口,但我在~aaa()析构函数中加入退出自己线程的代码时,销毁窗口总是已经执行了。我该在哪里退出自己的线程才能在销毁窗口之前执行。
    谢谢大家
      

  4.   

    在接收WM_DESTROY消息的地方退出线程
      

  5.   

    Windows的主线程有一个死循环,当×后,这个死循环将退出,并且主线程也就随之结束了.
    这里相当于main函数(WinMain)结束,于是所有主函数中定义的局部变量和全局变量都将执行析构函数。
    所有其他线程都应该在主线程结束前退出。
    如果这些线程没有退出,将在主线程结束后被操作系统立刻终止。这些线程中定义的局部变量不会执行析构函数。
      

  6.   

    点击X之后应当先处理WM_CLOSE,你可以在这里处理。
      

  7.   

    流程: X后自然调用WM_CLOSE 你自己不处理的话,去调用WM_DESTROY你可以在这两个消息处理中处理退出你的线程