学习多线程中,做了一个例子,从一对话框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清理一下资源,有没有什么后遗症还不知道。