【问题标题】:Use the cpu 100%使用cpu 100%
【发布时间】:2011-12-25 13:48:59
【问题描述】:

我需要一个能 100% 使用我的 cpu 的函数。我有单核 cpu 有什么想法吗?

线程是否需要设置为高优先级?

【问题讨论】:

  • 请否决和关闭原因...
  • 这不是我,但我很想这样做....只有在阅读了第一个答案后,我才明白了问题的重点。听起来您想智取操作系统以窃取其他人的 CPU 周期.....
  • 请注意,您的建议可能会减慢相同优先级的线程,不会影响优先级较高的线程并削弱优先级较低的线程 - 它们只能通过 CPU 获得。操作系统反饥饿算法,每 30 秒仅提供一次临时优先级提升。在单 CPU 机器上将一个 CPU 循环线程提高到非常高的优先级可能会导致需要重置“电源开关”。

标签: multithreading delphi


【解决方案1】:

循环(无限)通常可以很好地完成工作:

while true do begin

end;

显然,在不做任何有用的事情的情况下强制 CPU 达到 100% 应该只用于学术目的和在您自己的硬件上,而不是在您打算发布的任何实际应用程序中。

【讨论】:

  • 另外,如果您希望在此过程中拥有一个活动的 GUI,您需要在单独的(非 GUI 又名后台工作者)线程中生成它。此外,如果您有多个 CPU/内核或超线程,则需要与虚拟 CPU 一样多的线程。
  • 达林圣诞快乐。是时候放一天假了! :-)
  • 我一直在做这个 while 循环……不经意间。
  • @DavidHeffernan - 那你为什么还在这里?坎布里亚郡的所有酒吧都关门了吗,还是你昨晚被禁/宿醉... :)
【解决方案2】:

例如,通过下一个线程:

unit Unit2;

interface

uses
  Classes;

type
  TLoadThread = class(TThread)
  public
    class var Stop: Boolean;
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

implementation

constructor TLoadThread.Create;
begin
  inherited Create;
  FreeOnTerminate:= True;
end;

procedure TLoadThread.Execute;
begin
  repeat until Stop;
end;

end.

使用示例:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure LoadCPU;
begin
  TLoadThread.Stop:= False;
  TLoadThread.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LoadCPU;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TLoadThread.Stop:= True;
end;

如果你的CPU有N个核心,点击Button1N次即可达到100%的CPU负载;无需增加线程优先级。

【讨论】:

  • 在没有终止的情况下更容易做
  • 要调用终止,您需要保留对象引用,这在这里很不方便。
  • 没有发现 FreeOnTerminate。我自己从不使用它。不喜欢放弃控制权。
猜你喜欢
  • 2015-09-27
  • 2017-05-23
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多