Я начал делать именно это в своем собственном приложении Intraweb, хотя из-за того, что IWServiceWizard скрывает данные службы, включая основной цикл Execute, я сделал все это на стороне сервера, я использовал Application Mode.
Я определил метод heartbeat для своего класса сеанса (RunSQL - это метод на моем собственном объекте D Accessonnay Data Access Layer, это может быть простая оболочка вокруг TADOConnection).
function TIWUserSession.UpdateHeartbeat: boolean;
var
sSQL : string;
begin
sSQL := 'UPDATE Heartbeats SET LastComms = getdate()'+
' WHERE SessionID = '+ IntToStr(FSessionID);
Result := DBConnection.RunSQL(sSQL);
end;
После того, как я сделал это было тривиально вызвать этот метод (к примеру) всякий раз, когда пользователь открывает новую веб-страницу.
procedure TIWMyPage.IWAppFormCreate(Sender: TObject);
begin
inherited;
Session.UpdateHeartbeat;
end;
Это также может быть использован всякий раз, когда пользователь делает что-то, что обменивается данными с сервером, даже если это асинхронное событие (AJAX).
procedure TIWMyPage.btnRefreshAsyncClick(Sender: TObject;
EventParams: TStringList);
begin
Session.UpdateHeartbeat;
end;