如何比较干净杀死一个线程?

时间:2022-06-01 16:48:47

某个线程,其中包含窗口操作和网络操作;在超时的时候,需要杀死这个线程(该线程所使用的窗口资源,以后还要再用,不能破坏。),请问该如何操作?

有一小段示范代码最好。

17 个解决方案

#1



up.

#2


线程自己检测超时?如果超时,由其自己安全退出!

#3


该线程所使用的窗口资源,以后还要再用,不能破坏。)
??

啊啊啊啊。。。我学习...

#4


应该不是可以的 只有自己安全退出 才OK的。。。
不然 没人敢保证。。。

#5


DWORD WINAPI dwThread(LPVOID lParam)
{
  while(WaitForSingleObject(g_hKill,0)!=WAIT_TIMEOUT)
  {
    //你的代码....
    
  }
}
g_hKill是一个事件。要杀死线程先SetEvent(hKill)
然后WaitForSingleObject(线程句柄)就行了。

#6


让线程函数返回是最安全的退出,lzzqqq的方法和很好啊

#7




当然检测超时是在另外一个线程里面进行。

#8



lzzqqq(Jonersen) 的想法不错,不过好象不能适合while里面包含一个很长时间的操作。因为只有while里面的一步操作完成后,才去检查while的条件。但很多时候,这个操作可能已经死在那儿或者因为外部原因出错,还无法第二次执行while语句。 

我现在是用另外一个独立的线程,检查工作线程是否已经超时。超时是可以检测到的,但杀得有问题。

#9


当然让其自己退出是最好的.

#10



另外,该工作线程所使用的所有窗口资源,是主程序初始化时候就构造好的。工作线程只是使用这些资源,而不是由该工作线程创建这些窗口。

#11



up.

#12


当发生下列事件之一时,线程被终止:
线程调用ExitThread。
线程函数返回,即线程隐含调用了ExitThread。
ExitProcess被进程的任一线程显示或隐含调用。
用线程的句柄调用TerminateThread。
用进程句柄调用TerminateProcess。

但书上说,最好自己终止自己比较安全

#13


最好让线程自己退出

#14


让线程自己结束
在线程中判断由主线程控制的事件

#15


先定义CEvent g_eventKill全局事件对像
再在你所要控制的线程中添加(在循环语句中)
if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0) break;
这样在你需要结束这个线程时只要
g_eventKill.SetEvent();就行了.

#16


杀掉本地进程,取得进程ID后,调用OpenProcess函数打开进程句柄,然
后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。

#17


核心编程说了,杀线程有多种方法,但除了线程自己结束,其他都不推荐。

#1



up.

#2


线程自己检测超时?如果超时,由其自己安全退出!

#3


该线程所使用的窗口资源,以后还要再用,不能破坏。)
??

啊啊啊啊。。。我学习...

#4


应该不是可以的 只有自己安全退出 才OK的。。。
不然 没人敢保证。。。

#5


DWORD WINAPI dwThread(LPVOID lParam)
{
  while(WaitForSingleObject(g_hKill,0)!=WAIT_TIMEOUT)
  {
    //你的代码....
    
  }
}
g_hKill是一个事件。要杀死线程先SetEvent(hKill)
然后WaitForSingleObject(线程句柄)就行了。

#6


让线程函数返回是最安全的退出,lzzqqq的方法和很好啊

#7




当然检测超时是在另外一个线程里面进行。

#8



lzzqqq(Jonersen) 的想法不错,不过好象不能适合while里面包含一个很长时间的操作。因为只有while里面的一步操作完成后,才去检查while的条件。但很多时候,这个操作可能已经死在那儿或者因为外部原因出错,还无法第二次执行while语句。 

我现在是用另外一个独立的线程,检查工作线程是否已经超时。超时是可以检测到的,但杀得有问题。

#9


当然让其自己退出是最好的.

#10



另外,该工作线程所使用的所有窗口资源,是主程序初始化时候就构造好的。工作线程只是使用这些资源,而不是由该工作线程创建这些窗口。

#11



up.

#12


当发生下列事件之一时,线程被终止:
线程调用ExitThread。
线程函数返回,即线程隐含调用了ExitThread。
ExitProcess被进程的任一线程显示或隐含调用。
用线程的句柄调用TerminateThread。
用进程句柄调用TerminateProcess。

但书上说,最好自己终止自己比较安全

#13


最好让线程自己退出

#14


让线程自己结束
在线程中判断由主线程控制的事件

#15


先定义CEvent g_eventKill全局事件对像
再在你所要控制的线程中添加(在循环语句中)
if(::WaitForSingleObject(g_eventKill,0)==WAIT_OBJECT_0) break;
这样在你需要结束这个线程时只要
g_eventKill.SetEvent();就行了.

#16


杀掉本地进程,取得进程ID后,调用OpenProcess函数打开进程句柄,然
后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。

#17


核心编程说了,杀线程有多种方法,但除了线程自己结束,其他都不推荐。

相关文章