【问题标题】:CreateProcess with Priority Parameters?具有优先级参数的 CreateProcess?
【发布时间】:2012-01-30 16:46:35
【问题描述】:

如何从我的程序中创建和运行能够设置进程优先级的进程?

这是我目前所拥有的:

const
  LOW_PRIORITY            = IDLE_PRIORITY_CLASS;
  //BELOW_NORMAL_PRIORITY = ???
  NORMAL_PRIORITY         = NORMAL_PRIORITY_CLASS;
  //ABOVE_NORMAL_PRIROTY  = ???
  HIGH_PRIORITY           = HIGH_PRIORITY_CLASS;
  REALTIME_PRIORITY       = REALTIME_PRIORITY_CLASS;

procedure RunProcess(FileName: string; Priority: Integer);
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  Done: Boolean;
begin
  FillChar(StartInfo,SizeOf(TStartupInfo),#0);
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
  StartInfo.cb := SizeOf(TStartupInfo);
  try
    Done := CreateProcess(nil, PChar(FileName), nil, nil,False,
                          CREATE_NEW_PROCESS_GROUP + Priority,
                          nil, nil, StartInfo, ProcInfo);
    if not Done then
      MessageDlg('Could not run ' + FileName, mtError, [mbOk], 0);
  finally
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

上面的代码可以设置执行进程的优先级。但请看下面的 Windows 任务管理器图片:

您可以设置更多选项,例如低于正常值和高于正常值,这也是我希望能够设置的。浏览 Windows.pas 我看不到这样的价值。

如何使用这些额外参数创建和运行我的流程?

谢谢:)

【问题讨论】:

  • 没关系,我找到了答案。典型的,我尝试了很长时间才找到答案,一问我就找到了解决方案!将编辑我的问题以反映更改。
  • 我还是无法编辑。我在您的答案中添加了一条评论,它显示了我找到答案的链接。

标签: delphi delphi-xe


【解决方案1】:

这两个标志没有在 Delphi 附带的 Windows.pas 中声明。您必须自己声明这些值。这些值可以在 SetPriorityClass 的 MSDN 文档中找到。

const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000

顺便记住CreateProcess 修改了它的第二个参数lpCommandLine,也就是你传递给PChar(FileName) 的参数。因此,如果您调用传递位于只读内存中的字符串文字的函数,您的代码将失败。我会添加以下行

UniqueString(FileName);

在调用 CreateProcess 之前。更多信息可以在这里找到:Access Violation in function CreateProcess in Delphi 2009

【讨论】:

  • 我刚刚在 Google 搜索后从这里发现了这个:upxshell.googlecode.com/svn-history/r3/trunk/Source/MainSource/… 为什么它没有包含在 Windows.pas 中??
  • 感谢您提供额外的信息,我会确保我会更加小心 CreateProcess。
  • @Blobby 不确定。我的猜测是 Windows.pas 最初是为了支持没有这些优先级类的 Windows 版本而编写的。后来当它们被添加到 Windows 时,Delphi 标头并没有跟上。
  • 我想这是有道理的,在我发布的链接中指出了这两个优先级的操作系统兼容性。但我使用的是 Delphi XE,所以您希望现在包含/更新它。 Delphi XE-2 也一样吗? Embarcadero 确实应该更新其中一些过时的功能和东西 :) 因为这些不包括在内,我认为除非使用其他代码方法,否则这是不可能的。
  • 在XE2中也是一样的。我同意这是一个遗漏。也就是说,Emba 已经做了很多工作来改进和扩大标题翻译,但我想还有更多工作要做。如果您在 Windows API 上遇到问题,请务必在 MSDN 中查找。即使 Delphi 标头翻译不完整,您也始终能够访问新的 Windows 功能。
【解决方案2】:
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

Reference

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多