dum*_*uch 8 delphi performance windows-xp
假设我有一个程序会占用处理器和/或硬盘,以至于几乎无法在该计算机上执行任何其他操作.现在我不想杀掉那个程序,因为它的作用是有用的(这是一个批处理作业,真的是CPU或磁盘很重,例如它可以压缩几千兆字节的数据文件)但是我需要做的很短的时间那台电脑上别的东西.外部程序有什么办法可以暂时冻结性能杀手?
它就像旧的DOS选项,在没有多任务处理的情况下在程序之间切换.
假设有问题的假设程序是第三方产品,我没有源代码,也没有办法告诉它暂停.
我知道我可以改变程序的优先级,例如在TaskManager中,但这还不够,我想冻结它.
我说的是Windows XP作为操作系统,并希望用Delphi编写解决方案.我拥有该机器的所有权利,因此我可以以管理员身份启动,替换文件,如果有必要,我也可以安装服务.
Pet*_* G. 14
您可以使用Process Explorer冻结它:右键单击您的程序并选择Suspend
.
以下是程序冻结的示例代码,来自http://www.c-plusplus.de/forum/viewtopic-var-p-is-1460293.html,编辑并省略了错误检查以简化:
#include <windows.h>
_NtSuspendProcess NtSuspendProcess =
(_NtSuspendProcess) GetProcAddress( GetModuleHandle( "ntdll" ),
"NtSuspendProcess" );
HANDLE ProcessHandle = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid);
NtSuspendProcess( ProcessHandle );
Run Code Online (Sandbox Code Playgroud)
如果您想以编程方式执行此操作,则可以使用此处描述的方法.
做的是,枚举进程中的所有线程然后暂停它们.没有SuspendProcess API,因此这是对此类调用的模拟.
请注意,这可能会产生一些不良副作用.它取决于过程及其编写方式.
我不知道在Win32/64 API世界中有任何其他方法可以做到这一点.如果您降低到内核并使用NT*API,则可以使用"NtSuspendProcess"API.但这是没有记录的,所以它可以随任何版本的Windows甚至任何服务包更改(尽管不太可能).
"NtSuspendProcess"的声明可以在windows API的JEDI端口中找到.
您可以使用我的ProcessInfo组件来挂起属于该进程的所有线程。该方法与 Runner 向您解释的类似。代码会是这样的:
var
Process : TProcessItem;
AThread: TThreadItem;
begin
Process := ProcessInfo1.RunningProcesses.FindByName('notepad.exe');
if Assigned(Process) then
begin
for AThread in Process.Threads do
AThread.SuspendThread;
end;
end;
Run Code Online (Sandbox Code Playgroud)
您可以在这里下载ProcessInfo表单的源代码
归档时间: |
|
查看次数: |
3200 次 |
最近记录: |