对于SuspendThread函数的没有真正理解清楚.直到最近使用多线程执行任务的时候,发现有时候使用它比额外使用内核对象来更加方便.
DWORD WINAPI ThreadProc( PVOID pvParament )
{
int iCnt = 0;
while ( 1 )
{
cout<<iCnt<<endl;
if ( iCnt > 10000 )
{
break;
}
++iCnt;
}
return 0;
}
void main()
{
bool bExit = FALSE;
HANDLE hThread = CreateThread( NULL,0,ThreadProc,NULL,0,NULL );
Sleep( 2000 );
SuspendThread( hThread );
Sleep( 2000 );
ResumeThread( hThread );
WaitForSingleObject( hThread,INFINITE );
CloseHandle( hThread );
}
这里简单使用这两个函数来完成线程的运行-中断-继续的状态切换.
核心编程中关于如何完全终止线程问题做出了一些引导:让我们尽量实现线程自己退出,而不是使用Windows那些逼不得已的函数.
代码大概的意思是:
DWORD WINAPI ThreadProc( PVOID pvParament )
{
while( WaitForSingleObject( hEvent,INFINITE ) == WAIT_OBJECT_0 )
{
//循环做一些操作.循环里面保存当前状态.
}
return 0;
}
这样我们可以使用hEvent来控制线程的暂停,继续,和退出.这样总体来讲
这种写法主要的问题有:
1. 整个线程执行体都在while里面,但初始化代码不能放在while,现在的解决方案可能把初始化代码加到while的前面,这样唯一的问题在于无法掌控初始化代码的状态.
2. 线程在控制的时候并不能达到”暂停”的目地,因为需要我们去手动保存当前的状态,等到hEvent变成可触发状态时,再继续(整个过程完全由我们自己来控制),实际上我们可以使用SuspendThread.