多线程学习心得(一)----- 让人捶地的ExitThread

学习多线程中,做了一个例子,从一对话框A,生成新线程的B,然后B里面有个计时的子线程C,

B的头文件定义了

    

    DWORD dthread;
    HANDLE hthread;

 

有全局变量:

   volatile b_true=TRUE;
HWND thrhwnd;
int ii;
void ThreadTime()
{
  
  CTime time;
 CString strTime;
 b_true=TRUE;
  ii = 1;
 while(b_true)
 {
  time=CTime::GetCurrentTime();
  strTime=time.Format(_T("%H:%M:%S"));
//  SetDlgItemText(thrhwnd,IDC_TRI,strTime);
   ii++;
  Sleep(1000);
  }
}

 

然后在B的OnInitDialog()里加上

    hthread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadTime,NULL,0,&dthread);

 

在B中放置一按钮“Kill”,点击事件为:

    ExitThread(dthread);

 

好了,问题来了,由Debug发现,在建立那个计时线程时,传入dthread的ID为3800,而对话框B自身的ID为4060。

按下按钮Kill!ExitThread(dthread);中dthread是3800!成功,单步运行!战!对话框B不见了!-_-凸

debug若干次+百思不得其解后gg,发现好像不是只是我一个人是这样,不少人也有同样的问题,转用TerminateThread,停止计时线程成功,B继续运作。—皿—

 

翻了好几本书,包括一些比较“著名”的,没看到一本有说ExitThread会把除了参数里的那个线程干掉之外,还会把调用它的那个线程也一起给曰了 凸-_-凸。更多的是说TerminateThread不安全,目前暂时没辙,只能TerminateThread后加上CloseHandle清理一下资源,有没有什么后遗症还不知道。

你可能感兴趣的:(多线程,kill,null,c)