C++的线程是怎么终止

C++的线程是如何终止
C++创建了一个线程,在另一个线程如何禁止该线程。
我的功能是:在一个线程PALYPOC的功能是相当于一个播放的功能的,就是将五子棋的数据一个一个读出来,然后显示在棋盘上,相当于回顾一样。(一次播放可以会执行5.6分钟左右)

但是如果我不在想回顾了,我点击重新游戏的时候,我想终止这个线程怎么办。

1  网上说,正常返回,等函数正常返回,就要把这个回顾全部放完才返回,我黄花菜都凉了。

2  还有用什么TerminateProcess的,这个是不建议用的,不会释放占用内存,我用这个函数以后,下次在打开这个文件就打不开了。

3 还有说用个信号量或者表示符的,让我在线程里面做死循环,这个有问题的,(1)这个就意味这,要结束这次循环后才能退出,但是实事上,我只执行一次而已。 (2)我那代码很多的,我怎么用死循环搞啊

还有没有更好的办法,麻烦有办法的就说一下吧,不要说某某书籍有,哪个哪个视频有,直接说一下不行么,你说个视频,说个书籍,我回头还得自己找,还得重新看,你说一下就几分钟的事,这么折腾一点意义都没有。

下面是我的那个线程的方法,可以不看,有兴趣的可以看看能不能用循环搞出来。

//播放线程
DWORD WINAPI PlayProc(LPVOID lpParameter)
{
DATA_PALY *playData=(DATA_PALY *)lpParameter;
CFIVE_CHESSDlg *p=(CFIVE_CHESSDlg*)AfxGetMainWnd();
CFile file(playData->Filename,CFile::modeRead);
CArchive textfile(&file,CArchive::load);
CString data;
textfile>>data;
SplitStr dataArray;
dataArray.SetSplitFlag("+");
dataArray.SetSequenceAsOne(true);
dataArray.SetData(data);
dataArray.GetSplitStrArray(p->n_SaveData_Step);
int Count=p->n_SaveData_Step.GetSize();
for (int i=0;i<Count-1;i++)
{
SplitStr temp;
CStringArray stepData;
temp.SetSplitFlag(",");
temp.SetSequenceAsOne(true);
temp.SetData(p->n_SaveData_Step[i]);
temp.GetSplitStrArray(stepData);
int x=atoi(stepData[0]);
int y=atoi(stepData[1]);
int color=atoi(stepData[2]);
int step=atoi(stepData[3]);
CPoint point(x,y);
p->P_DrawChess(point,color);
Sleep(playData->speed);
  CSound sound;
  sound.PlayMusic(F_MUSIC_PUTCHESS,1);
CString Step;
Step.Format("第 %d 手",step+1);
p->GetDlgItem(IDC_STEP)->SetWindowText(Step);
}
if (p->n_SaveData_Step[Count-1]=="BLACK")
{
     AfxMessageBox("本轮黑棋获胜");
}
else
{
     AfxMessageBox("本轮白棋获胜");
}
p->GetDlgItem(IDC_TIPS)->EnableWindow(FALSE);
    return 0;
}

------解决方案--------------------
引用:
看了一下你的代码,也没有你想的那么简单,你代码里面有一个延时,如果线程刚好进入到延时函数,那么就算你终止了线程,线程还是会卡上一会,等延时执行完了才会推出。

这个问题还不好解决吗。

for()
{
    ...
    while(等待时间大于等于playData->speed)
    {
        if (线程该退出了)
        {
            break;
        }
        Sleep(1);
    }
    ...
}