&& server objects (compile into COM-Exe) DEFINE CLASS oTestServer AS Session OLEPUBLIC loCallback = .NULL. && saves reference to callback object lAdvised = .F. && is callbackobject set? HIDDEN loTimer FUNCTION Init DECLARE INTEGER Sleep IN WIN32API INTEGER THIS.loTimer = CREATEOBJECT('dirTimer',THIS) ENDFUNC FUNCTION Destroy THIS.loTimer = NULL CLEAR DLLS ENDFUNC FUNCTION FireEvent AS VOID LPARAMETERS lcSomeValue IF THIS.lAdvised THIS.loCallBack.EventMethod(lcSomeValue) ENDIF ENDFUNC FUNCTION Advise AS VOID LPARAMETERS loObj THIS.loCallback = loObj THIS.lAdvised = .T. ENDFUNC FUNCTION UnAdvise AS VOID THIS.loCallback = .NULL. THIS.lAdvised = .F. ENDFUNC FUNCTION SomeMethodThatFiresEvents AS Boolean && prepare something THIS.FireEvent('Task startet .. ') Sleep(5000) THIS.FireEvent('Task finished X percent ..') Sleep(5000) && do more THIS.FireEvent('Task fineshied XX percent ..') && .. ENDFUNC FUNCTION DoSomeAsynWork AS Boolean THIS.loTimer.Interval = 1 RETURN .T. ENDFUNC ENDDEFINE DEFINE CLASS dirTimer AS Timer Interval = 0 loParent = NULL FUNCTION Init LPARAMETERS loObj THIS.loParent = loObj ENDFUNC FUNCTION Destroy THIS.loParent = NULL ENDFUNC FUNCTION Timer THIS.Interval = 0 && do some work Sleep(1000) && sleep to simulate some work .. THIS.loParent.FireEvent('Timer Fired') ENDFUNC ENDDEFINE && client testprogram startprocess.prg: PUBLIC loFoxServer, loEventhandler loFoxServer = CREATEOBJECT('testcom1.oTestServer') loEventHandler = CREATEOBJECT('oTestCallback') loFoxServer.Advise(loEventHandler) DEFINE CLASS oTestCallback AS Session OLEPUBLIC FUNCTION EventMethod LPARAMETERS lcSomeParam ? lcSomeParam ENDFUNC ENDDEFINE startasyn.prg: ?loFoxServer.DoSomeAsynWork() && returns immediately .. && simulate block situation DECLARE INTEGER Sleep IN WIN32API INTEGER Sleep(15000) && the event of ther server is fired when this runs endprocess.prg: loFoxServer.Unadvise() loFoxServer = NULL loEventhandler = NULL>IS it possible in any VFP version to program using threads? If so, can someone please point me to an article?