DelphiでSleep sort

Sleep sortの各言語での実装まとめ – Yuyak」にDelphiによる実装がなかったので挑戦してみた。
# Delphiは初心者はのであまり自信がない。

Sleep sortについては、「常識を覆すソートアルゴリズム!その名も"sleep sort"! – Islands in the byte stream」をご覧ください。

実行方法は、プログラムの引数にソートする値を与える。

Project1.exe 1 3 5 2 4

ソースコード

uses
  SysUtils, Classes, Generics.Collections;

type
  {個々の要素の遅延表示を行うスレッド}
  TSleepSortThread = class(TThread)
  private
    FNumber: Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(Number: Integer); overload;
  end;

constructor TSleepSortThread.Create(Number: Integer);
begin
  FNumber := Number;
  inherited Create(False); { 引数のFalseは「スレッドをすぐに実行する」 }
end;

procedure TSleepSortThread.Execute;
begin
  inherited;
  { Sleepの引数はミリ秒なので1000をかける }
  Sleep(FNumber * 1000);
  { Writelnは排他処理が必要かもしれない }
  Writeln(FNumber);
end;

procedure SleepSort;
var
  I: Integer;
  ThreadList: TObjectList<TSleepSortThread>;
  Thread: TSleepSortThread;
begin
  ThreadList := TObjectList<TSleepSortThread>.Create(True);
  { スレッドを作成して順次実行する }
  for I := 1 to ParamCount do { ParamCount(0)はプログラム名なので1から始める}
  begin
    ThreadList.Add(TSleepSortThread.Create(StrToInt(ParamStr(I))));
  end;
  { すべてのスレッドが終了するまで待機する }
  for Thread in ThreadList do Thread.WaitFor;
  ThreadList.Free; { TObjectListはリストの要素を破棄する }
end;

begin
  try
    SleepSort();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

コメント

  1. Pingback: Sleep sortの各言語での実装まとめ – Yuyak

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください