线程类,线程函数的终止 .
来源:互联网 发布:高访问量解决方案 java 编辑:程序博客网 时间:2024/05/11 23:02
正确终止线程的方法
<1>终止线程类
//向线程发退出消息,线程类对象执行ExitInstance()在该函数中删除自己申请的堆栈
if(m_PwroffInfoRecvThread!=NULL) m_PwroffInfoRecvThread->PostThreadMessage(WM_QUIT,0,0);
//当线程退出时m_PwroffInfoRecvThread->m_hThread是有信号状态
//如果1秒后线程还没退出,强制terminate
if (::WaitForSingleObject(m_PwroffInfoRecvThread->m_hThread, 1000) == WAIT_TIMEOUT)
{
::TerminateThread(m_PwroffInfoRecvThread->m_hThread, 0);
delete m_PwroffInfoRecvThread;
}
if(m_SmsClientThread!=NULL) m_SmsClientThread->PostThreadMessage(WM_QUIT,0,0);
if (::WaitForSingleObject(m_SmsClientThread->m_hThread, 1000) == WAIT_TIMEOUT)
{
::TerminateThread(m_SmsClientThread->m_hThread, 0);
delete m_SmsClientThread;
}
<2>终止线程函数
只要线程函数返回,该线程就会退出。所以在线程函数中可以一个事件(WaitForSingleObject(>m_hThread, 0)==WAIT_OBJECT_0) 当要退出 时将该事件置成有信号态 线程函数返回 线程自动退出
开始定义一个事件对象
hSingle = ::CreateEvent(NULL,FALSE,FALSE,NULL);//将该事件默认成无信号状态
线程函数中处理流程如下
UINT WriteW(LPVOID pParam)
{
CMainFrame *pMainFrame=(CMainFrame*)pParam;
int i = 0;
while(TRUE)
{
if(WaitForSingleObject(pMainFrame->hSingle==WAIT_OBJECT_0) //如果信号是有状态 线程函数返回
{
TRACE("线程函数退出了!");
return 0;
}
i+=1;
Sleep(1000);
}
return 0;
}
关闭线程函数操作
::SetEvent(hSingle);
if (::WaitForSingleObject(pWriteW->m_hThread, 1000) == WAIT_TIMEOUT)
{
::TerminateThread(pWriteW->m_hThread, 0);
delete pWriteW;
}
CloseHandle(hSingle);
线程的几种终止方法
1) 线程正常结束,线程函数返回,向线程类发WM_QUIT消息终止线程(最好使用这种方法)。
这是确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。
操作系统将正确地释放线程堆栈使用的内存。
系统将线程的退出代码设置为线程函数的返回值。
系统将递减线程内核对象的使用计数。
(2) 调用ExitThread函数(最好不要使用这种方法)。
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消。
(3) 调用TerminateThread函数(应该避免使用这种方法)。
TerminateThread能撤消任何线程。线程的内核对象的使用计数也被递减。TerminateThread函数是异步运行的函数。如果要确切地知道该 线程已经终止运行,必须调用WaitForSingleObject或者类似的函数。当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈 也被撤消。但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。
(4) 包含线程的进程终止运行(应该避免使用这种方法)。
由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。就像从每个剩余的线程调用TerminateThread一样。这意味着正确的应用 程序清除没有发生,即C++对象撤消函数没有被调用,数据没有转至磁盘等等。
一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调GetExitcodeThread来检查由hThread标识的线程 是否已经终止运行。如果它已经终止运行,则确定它的退出代码。
- 线程类,线程函数的终止
- 线程类,线程函数的终止 .
- JAVA线程的终止
- 终止线程的运行
- 线程的终止
- -终止线程的运行
- 线程终止的问题
- 终止线程的运行
- 线程终止的方式
- 线程的终止
- 线程的终止
- 终止线程的方法
- 终止线程的方法
- 终止线程的方法
- 终止线程的方法
- 1.6线程的终止
- 线程的终止
- 线程终止的方法
- Oracle RMAN的备份与恢复命令详解(一)
- ARM体系结构与编程学习(六)
- 屏幕坐标系和窗口客户区坐标系最明显的区别
- 第五周上机任务项目3-(编写基于对象的程序)
- 488 - Triangle Wave
- 线程类,线程函数的终止 .
- 成长没你想的那么急切
- Android开发笔记-Activity生命周期详解
- 说出数据连接池的工作机制是什么?
- ARM体系结构与编程学习(七)
- c#走出误区。
- 第一次上机作业
- 小小的情感
- sap模板