[强制][结束][进程]如何强制结束一个进程
09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »
在多线程调试的时候(XP操作系统下),经常会出现死机的现象,不得不进行重启才能解决。
后来找到一个名为antifreeze的国外软件,在几乎死机的时候还可以调用该程序,将环境进程结束掉。
另外发现,VC环境下,在设置断点断下的时候,这个时候即使用任务管理器无法将此刻调试的进程结束掉,这是为什么?
我的问题是,在系统几乎死机的时候,如果让自己的程序还能获取CPU分配的时间,将我需要结束的进程结束掉?谢谢
普通方法都试了,不行,因为多线程死机的时候,几乎没有程序可以响应了。
有些时候是死在内核模式下,这时候进程管理器通常无法结束。或许有些情况可以利用驱动程序在内核模式下结束进程。
能具体给出实例吗?谢谢!
LS的方法不错,学习了!
mark
AllocConsole/FreeConsole即可
多线程调试的时候,确实是会经常假死,但是可以用以下方法解决(本人经验。^^)
打开记事本,写一些东西,别保存,当调试发生假死的时候。可以按ctrl+alt+del选择注销,系统会把VC给结束掉,之后会问时候保存文件,点取消即可恢复正常。从而避免重新启动机器。
以前编译过一个GINA(代码不是我的)。就是对付VC调试造成系统假死的。同样有效。
———————
我的问题是,在系统几乎死机的时候,如果让自己的程序还能获取CPU分配的时间,将我需要结束的进程结束掉?谢谢
普通方法都试了,不行,因为多线程死机的时候,几乎没有程序可以响应了。
———————-
你说的这些话是不对的,首先假死的时候,系统还可以快速响应热键!例如ctrl+alt+del,antifreeze也是如此。其次,发生假死的时候CPU空闲接近100%!不信你就按下热键,选择任务管理器。第三,antifreeze接收到热键,会切换到另外一个桌面,并挂起所有的线程,结束进程应该是TerminateProcess,我在调试器里发现它被调用。第四,要结束的进程不是被调试进程,而是VC。
关注 接分
[军训][结束][四级]散分了~~ 军训结束暨四级通过~~开心啊~~
08月 29th, 2008 by admin
Posted in VC/MFC | No Comments »
四级考了好多次,终于过了啊~~
军训有结束了,太开心了~~
gong xi ““
恭喜恭喜。
jf&gx
晕,怎么你们这时候才军训啊
jf
大家真快
开心就好^_^
恭喜~~ 接分
恭喜
Congratulations!
GX
散完了~
[线程][结束]请教一个子线程无法结束的问题
07月 28th, 2008 by admin
Posted in VC/MFC | No Comments »
我用CreateThread创建子线程,
线程启动方式suspend方式后再resume
当系统的内存耗尽时,
会出现无法Terminate该子线程的情况
而且,我发现此时父线程Sleep了好几秒,都无法重新进入到该子线程
这是什么缘故?
重复,再重复… 不出问题很难。
线程池也许是个好办法。也许用不着线程池,可能你的方法有问题。
可以耗尽系统内存的程序不太好吧.
如果同时存在多个相同线程可以用线程池,否则没必要.
耗尽内存是不容改变的事实
因为我是用来显示很多幅图像(这儿的架构不允许我去改变了)
当然,在程序中会判断内存情况,有个阈值,让它耗到一定比率就会开始释放一部分
这个阈值不允许我去设置
现在的方法是重复创建线程(目前是2千左右就会出问题)
to zhoujianhe:我的程序会有什么问题?能不能说点你的经验或者猜想?
比如子线程,父线程中都有sleep导致的?
现在的问题是
内存耗完了,子线程也创建成功了
但即使父线程sleep了
子线程也一直分配不到时间片
不会吧.不断Create再Terminate???
Terminate本来就不是推荐的做法.会造成线程占用的资源不能释放.当然会有资源泄漏.
方法有问题.根据你的需要改为其他实现.比如楼上说的:线程池.
系统资源耗尽的时候可能遇到很多问题,很多软件包括驱动程序都有可能出错,程序中需要判断各种可能失败的情况并进行适当的处理。
资源耗尽是我夸张的说法
我的程序中会根据有可用物理内存判断的,用到一定程度时会调用释放内存的代码
所以我的代码只会耗掉比较多的资源,
我现在的问题是,为什么在这种情况下,子线程都被创建成功了,却无法获得父线程sleep时的系统时间片
方法的确是有问题的,我改为线程池后就ok
不过很想了解CreateThread,Terminate这种方法的缺陷
是阻塞么?
你去看看windows核心编程 你用的CreateThread,Terminate 这两个函数都是建议不要使用的
上面写的很详细!
TerminateThread返回失败是吗?错误码是什么?
TerminateThread返回成功的
总之,现在的问题是创建成功的子线程获取不到CPU时间片
哪怕系统CPU占用率在1%.
我现在用了线程池就没这个问题了
我先去看看windows核心编程怎么说的
[结束][CWinThread]请问如何结束CWinThread
07月 25th, 2008 by admin
Posted in VC/MFC | No Comments »
如下一个最简单的例子线程:
HANDLE hThreadEvent;
unsigned int testProc(void * pParam)
{
WaitForSingleObject(hThreadEvent,INFINITE);
return 1;
}
而
pThread->ExitInstance();
CloseHandle(pThread->m_hThread);
delete pThread;
三句话都不能使其结束
只能 SetEvent(hThreadEvent) ,可是我真正的程序里面有好几个event,这样很麻烦
请问有什么比较简单的方法结束一个CWinThread线程吗?
尽最大可能不要用TerminateThread
所有的线程的安全退出方法是从线程内部退出,i.e. 在线程内调用ExitThread
就是while(flag)+ WaitForObject呗?
不要以为很简单,灵活运用这两个是个很高深的学问。不要刚知道答案就开始浮起来了
线程函数返回,最直接,安全的方法!
请问一个event能不能触发多个WaitForSingleObject啊?
我的印象中是可以的,可是我现在这么写,却不好使,不知道为什么
定义一个全局的event:
HANDLE hExit = CreateEvent(0,true,false,0);
每个线程等两个event
thread_proc()
{
if (WaitForMultipleObject(2, hEvents, false, INFINITE)== WAIT_OBJECT_0 +1
//被通知退出了
}
其中
hEvents[0] = 各个不同的event
hEvents[1] = hExit
通过一个函数来通知所有的线程退出
void quit()
{
SetEvent(hExit);
}
可是现在不好使啊……………
我突然明白我的问题了:
我是要结束线程池中CREATE_SUSPEND的线程啊!
按说我上面的做法对跑起来的线程没问题
可是创建以后就挂起来还没有跑的线程,根本没机会去wait for signal然后退出啊…..
大哥们,请问如何释放挂起来没执行的线程啊????
这种情况没有需要释放的东西,直接terminate即可。不过你创建一个线程啥都不干退出干嘛?
莫非只好用大家都不鼓励的TerminateThread了么?
用TerminateThread的话,线程函数里还需要调用ExitThread不?
道理简单,实现起来很麻烦。
现在我打算用TerminateThread了,不用事件了
如果用TerminateThread还需要closehandle和delete CWinThread么?
顶一下
看来这个问题很难
到底需不需要delete CWinThread啊?!!!!!
不建议强制结束线程
最好在线程里设个标记位,要结束的时候,设置这个标记位,然后线程的执行体函数自然退出
给线程发消息可以用PostThreadMessage,然后发送WM_QUIT,就可以了
那么请问发送WM_QUIT以后,还需要delete pThread吗?
想请教下线程中怎样收取PostThreadMessage发过来的WM_QUIT?
唉,建议楼主去读下有关线程的基础知识吧。像你这么像苍蝇一样乱撞看着难受。
[同时][结束][进程]VC++如何同时结束两个进程呢
06月 9th, 2008 by admin
Posted in VC/MFC | No Comments »
我中了一个病毒,发现是双进程,互相守护,没法结束,我想通过
VC编程的方法,结束之,但不知道windows下的结束进程的机制,
想问问大家,有没知道的,给说一下!
网上见过有网友通过设置两个间隔均极小的定时器,在每个定时器中分别杀掉一个进程,这样只要循环几分钟,总能遇到两个进程彼此顾不过来的情况,于是捡漏即可杀掉这两个相互保护的进程。
我猜它是靠事件来驱动的,用Procxp看一下该进程的事件句柄。或者查看的文件信息,使访问文件还是注册表等,确定后就可以解决了。
先把它们的优先度设置到最小,开一个比较耗费资源的程序,使cpu占用到100%,然后就可以删了,动作要快.
用程序的话可以先suspend一个,杀一个,再杀suspend的那个
假如我想线程来实现,该如何做呢?
把两个线程都suspend,然后用GetThreadContext/SetThreadContext将它们当前EIP都指向ExitThread, 然后Resume它们
双进程应该比较好杀,可以找到进程对应的EXE文件,用UNlock工具解锁,然后强制设置权限为任何人无权限操作(不要删除),这样可能可以在重启后防止他启动,有时很好用,不过本人写的了一个保护系统的工具,用于防止用户越权操作某些功能的,只一个进程却更难杀,为什么呢?因为使用植入winlogon.exe的方法,你总不能杀了winlogon.exe吗?一来系统不让杀,二来就算杀了,也会导到立即关机.而且源EXE文件不让设置权限。当然这个不让设置权限也包括反复写回正常权限,这步是很麻烦的。一般毒病不是这么做。
有这样的现成程序, 解决办法是有点。我不知道
[安全][结束][线程]安全结束线程
06月 8th, 2008 by admin
Posted in VC/MFC | No Comments »
现在有个问题:
开启一个线程该线程函数内去完成较长时间的文件处理工作。
即func 内完成如下:
A
到
B
到
c
到
….
然后线程退出
上述处理时间较长… 那当上诉线程中的文件处理工作进行时,用户取消该文件处理。
我这边想让该线程能够安全退出 ,通过什么方式比较好呢,查拉下论坛里头其他线程退出的帖子
现在有几种方法, 1.向线程发送线程消息。2 发送事件。
上述两种方法我觉得是最好放在有while循环这种逻辑里头较好使用。
而 我遇到的线程函数里头的功能执行是顺序执行。那有什么好的方法能让该线程能够安全退出.
用全局变量吧, 过一会儿,就 if (g_flagCancel) return; 一次.
结束线程不能单靠外部线程想办法,你需要备结束的线程也一样要采取一些设计上的控制。例如,你线程需要顺序执行很多操作,首先要控制每步操作的时间(例如你要读文件,就不要一次把文件都读完并处理完,而应该每步只读一点并处理一点(如几M)),然后每步操作之间都需要检查是不是有人要求该线程退出。
安全结束线程的关键在于被结束线程定时检查是否有人要求自己退出,如果有,则清理并退出。至于怎么提供“要求退出”的通知机制,方法很多,消息也可以,传个控制变量也可以。
被结束线程应该控制住,每隔不到1秒必须检查一次是否需要退出,否则用户的cancel动作就会有delay的感觉
受教拉 谢谢各位
[操作][结束][后都要]ado 操作结束后都要释放哪些指针?为何我的一个指针释放不成功?帮忙看看
05月 21st, 2008 by
Posted in VC/MFC | No Comments »
在stdafx.h 中已经添加#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","moveEOF"),现在一个button,响应函数如下,已经可以写进数据库,但是在释放pRst->Close();时,runtime error,通过调试,我确定了pRst->Close();故障点,但是我不明白,为什么这个指针会有问题?还要->和.操作有何不同?是否一定要释放两次?pCmd 要释放吗?
void CMoveFilesNoKeyDlg::OnBtnAddDir()
{
// TODO: Add your control notification handler code here
// UpdateData();
CString sCmd=_T("");
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));
pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\develop\\MoveFilesNoKey\\Debug\\config.mdb;Mode=ReadWrite ¦ Share Deny None;Persist Security Info=False";
pConn->Open("","","",adConnectUnspecified);
//MessageBox("1!");
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
sCmd.Format ("insert into dirConfig(sdir,ddir) values ('%s','%s')",m_sSdir,m_sDdir);
//pCmd->CommandText=(_bstr_t)("insert into dirConfig(sdir,ddir) values(" + m_sSdir+","+m_sDdir+")"); //dirConfig是config.mdb数据库的一个表
pCmd->CommandText=(_bstr_t)(sCmd);
//MessageBox("2!");
pRst=pCmd->Execute(NULL,NULL,adCmdText); //to execute the sql command
/* pRst->Close();*///i dont know the reason why it can not to be closed
pConn->Close();
//pCmd->Release ();
//pCmd.Release();
pRst.Release();
pConn.Release();
CoUninitialize();
}
你没有Open,不需要Close
俄
上面说得可能不清楚
问题在你的sql语句是insert 而非select
使用 Command 对象的 Execute 方法将执行在该对象的 CommandText 属性中指定的查询。如果 CommandText 属性指定以行返回的查询,执行产生的任何结果都将存储在新的 Recordset 对象中。如果此命令不是以行返回的查询,提供者将返回关闭的 Recordset 对象。如果不需要 Recordset,某些应用程序语言允许忽略此返回值。
你说的有道理,我就是在执行insert的时候,pRst->Close()关闭才出现,应该没有必要关闭pRst,因为不是select
记录集没有Open就不需要Close
另外用#import导入的类型库,VC都自动生成了智能指针。例,_ConnectionPtr 就是_Connection*的智能指针。
智能指针不需要手动调用Release的,因为它在析构的时候会自动调用Release
至于->和.的区别
.调用的是智能指针的成员函数或者变量
而->调用的是接口的函数或者属性
up
关闭打开的记录集和数据库