15,471
社区成员
发帖
与我相关
我的任务
分享
//播放线程
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);
}
...
}
[/quote]
你的意思是另外启动一个线程监控,
请问你的等待时间怎么计算,是正常的每一个循环所用的时间吗?感觉你这段代码没有用,还是一样要等待playData->speed长的时间才能退出。
不过你的这种方式倒是提醒了我快速终止线程的方法,那就是把时间分成很小的时间段,结合楼上的具体实现如下:
tmp=playData->speed;
while(tmp){
if (bStop==true)
退出线程;
}
所以你的那段代码就不用了。
[/quote]
Sleep(playData->speed)后,需要等待大致playData->speed这么长时间该线程才会被唤醒,你才有机会处理Sleep下一句。
for()
{
...
DWORD dwStart = ::GetTickCount();
while(::GetTickCount() - dwStart < playData->speed)
{
if (bStop)
{
break;
}
Sleep(1);
}
if (bStop)
{
释放资源等操作;
return 0;
}
...
}
for()
{
...
while(等待时间大于等于playData->speed)
{
if (线程该退出了)
{
break;
}
Sleep(1);
}
...
}
[/quote]
你的意思是另外启动一个线程监控,
请问你的等待时间怎么计算,是正常的每一个循环所用的时间吗?感觉你这段代码没有用,还是一样要等待playData->speed长的时间才能退出。
不过你的这种方式倒是提醒了我快速终止线程的方法,那就是把时间分成很小的时间段,结合楼上的具体实现如下:
tmp=playData->speed;
while(tmp){
if (bStop==true)
退出线程;
}
所以你的那段代码就不用了。
for()
{
...
while(等待时间大于等于playData->speed)
{
if (线程该退出了)
{
break;
}
Sleep(1);
}
...
}