Как правильно работать с потоками?
необязательно создавать глобальную переменную output_message
в Syncronize можно передать анонимную процедуру, тогда сообщение можно хранить в локальной переменной процедуры потокаprocedure TMyThread.Execute;
var 
  Msg: string;
begin 
  ... 
  Syncronize(procedure() begin 
    Show_message(Msg); 
  end);
end.
P.S. так объекты лучше не освобождать file_list.Destroy;
лучше использовать Free или FreeAndNil file_list.Free; 
// или
FreeAndNil(file_list);
Участвуя в ответе на вопрос Как исправить ошибку listerror list index out of b... хотел предложить использовать поток для отдельного файла. Каждый файл будет обрабатываться отдельным потоком.Форма:unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private { Private declarations }
  public  { Public declarations }
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
  var fl: String;
      tr: TSome;
begin
  fl := ExtractFilePath( Application.ExeName ) + GUIDToString( TGUID.NewGuid ) + '.thr';
  tr := TSome.Create( fl );
  ListBox1.Items.Add( fl );
end;
end.Поток:unit Unit2;

interface

uses  System.Classes, System.SysUtils;

type
  TSome = class(TThread)
  private   { Private declarations }
    FFile: String;
    FMess: String;
    procedure UpdateForm;
  protected
    procedure Execute; override;
  public    { Public declarations }
    constructor Create( sFile: String );
  end;

implementation

uses Unit1;

constructor TSome.Create( sFile: String );
begin
  FFile := sFile;
  inherited Create( False );
end;

procedure TSome.Execute;
  var outfile: TextFile;
      tr: String;
begin
  while not Self.Terminated do begin
    tr := IntToStr( Self.Handle ) + ' - '+ DateTimeToStr( Now ());
    AssignFile( outfile, FFile );
    Rewrite( outfile );
    Writeln( outfile, tr );
    CloseFile( outfile );
    Self.FMess := tr;
    Synchronize( UpdateForm );
    Sleep( 1000 );
  end;
end;

procedure TSome.UpdateForm;
begin
  Form1.ListBox1.Items.Add( Self.FMess );
end;

end.