线程中一个比较大的问题,就是任务一般是死循环. 而且如果强行终止线程,往往会带来内存泄漏的问题. 这方面最好的办法,就是设置一个值作为标志. 如果这个标志发生了变化,就break.
最好的方式是用事件的方式,而不是用sleep()轮询的方式. 因为sleep是有不可避免的时间差的. 下面看例子.
UINT MyThreadProc( LPVOID pParam ) { string *pStr = (string *)pParam; CString str; str = pStr->c_str(); delete pStr; for ( ; ; ) { DWORD dwRetVal; dwRetVal = WaitForSingleObject( m_hThreadEvent, 2000 ); // 2000是超时时间 if ( dwRetVal == WAIT_TIMEOUT ) { // TODO: MessageBox(0, str, 0, 0); } else { // stop receive text thread. DWORD dwExitCode; GetExitCodeThread(m_hThread, &dwExitCode ); // AfxEndThread( dwExitCode, TRUE ); // 退出方式, break优于GetExitCodeThread. 后者可能会导致内存泄漏 break; } } return 0; }启动线程的方式为:
string *pStr = new string("hello world!"); m_hThread = AfxBeginThread(MyThreadProc, pStr);是否带一些参数进去,可以自己选择.
而停止线程的方式,使用事件.
SetEvent(m_hThreadEvent); //触发事件而初始化时,就应该将event创建好.
m_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);其它的方面,需要注意closeHandle(); 关闭线程和事件的内存资源.
