While playing with my Sidescroller I decided I should put the physics into their own thread via an SDL timer. I was amazed when it didn't work

Here is the base code for reference:
Code:
unit uCollisionEngine;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, uApeEngine;

var
  APE : TApeEngine;

procedure InitCollisionEngine;

implementation

uses
  uVector, sdl, uDebugger;

var
  engineSDLTimer : PSDL_TimerID;

function CEngine_Timer( interval: UInt32; param: Pointer ): UInt32; cdecl;
begin
  APE.Step;
  Debug('CEngine_Timer called');
  result := interval;
end;

procedure InitCollisionEngine;
begin
  if assigned(engineSDLTimer) then
    exit;
  engineSDLTimer := SDL_AddTimer(100, @CEngine_Timer, nil);
end;

initialization
  APE := TApeEngine.Create;
  APE.Init(0.1);
  APE.AddMasslessForce(Vector(0,3));
  APE.ConstraintCycles := 10;
  engineSDLTimer := nil;

finalization
  if assigned(engineSDLTimer) then
    SDL_RemoveTimer(engineSDLTimer);
  APE.Free;

end.
After calling InitCollisionEngine engineSDLTimer is still NIL and the CEngine_Timer function never gets called.

Any ideas?