首先我在OnInitDialog()里CreateThread一个线程.线程方法中用  CLogTestDlg *p=(CLogTestDlg*)::AfxGetApp()->GetMainWnd();  
   p->OnBnClickedGo();
触发了界面的我需要OnBnClickedGo方法.在OnBnClickedGo方法里我加入了 TerminateThread(hThread,0);   
         CloseHandle(hThread);   
         WSACleanup();  
  以结束线程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 可是OnBnClickedGo也随之结束不执行了。
 请问咋样让我的这个线程结束 且不影响OnBnClickedGo的正常执行?------------------------------------附加一个问题-------------------------------------------------
CLogTestDlg *p=(CLogTestDlg*)::AfxGetApp()->GetMainWnd();
和 CLogTestDlg p;
 和   CLogTestDlg *log=new   CLogTestDlg (); 
这三个实例化的区别是什么啊???

解决方案 »

  1.   


    MFC 中建立工作线程使用 AfxBeginThread
    结束线程,最好是通过全局变量等方法,让线程函数自如退出。
      

  2.   

    1. 从你描述中看不出那个函数不工作的原因,估计只有去调试才能知道
    2. 线程结束最好不要用TerminateThread,如果用了,则意味着在线程内堆栈上分配的对象都无法被清理(一个潜在的原因of问题1)
    唯一安全的方法是线程自己退出处理函数,结束自己
    3. 
    a) 这不是实例化,是获得一个现有实例的指针
    CLogTestDlg *p=(CLogTestDlg*)::AfxGetApp()->GetMainWnd(); 
    b) 这在堆栈上定义一个临时的CLogTestDlg对象
     CLogTestDlg p;
    c) 下面则是在堆上分配一个对象
     和   CLogTestDlg *log=new   CLogTestDlg ();  
      

  3.   

    arong1234 
    阿荣 你好!当我执行到 CloseHandle(hThread);   
    方法就停止不执行了
      

  4.   

    让线程结束最好设置个开关变量或者信号量,而不是用TerminalThread如
    while(m_sigle)
    {
        ..........
    }
      

  5.   

    1.最后我是用return结束的线程方法!
    2.用     WSACleanup(); //释放soket占用的ws3help.dll资源
      

  6.   

    CloseHandle又不是阻塞性操作,估计你代码另外有阻塞性操作导致主线程被阻塞在那,或者线程被强制结束破坏了什么环境
      

  7.   

    照荣哥说得,结束一个线程的最安全的方法是在线程自己里边结束自己,
    设置一个信号量 然后wangforsingleobjec,判断信号量是否有信号,要么
    return,要没exitthread