Did you know if you add an object to a collection, and the object contains a RELEASE method, it will automatically be removed from the collection when the object is released?
Check out this example code:
oCollection = CREATEOBJECT("MyCollection")
FOR i = 1 TO 10
IF MOD(i,3) == 0
?"No Release"
o = CREATEOBJECT("ObjNoRelease")
oCollection.Add(o)
ELSE
o = CREATEOBJECT("ObjWithRelease")
oCollection.Add(o)
?"With Release()"
ENDIF
ENDFOR
?"Collection Count: " + ;
ALLTRIM(TRANSFORM(oCollection.Count))
lnCount = oCollection.Count
FOR i = lnCount TO 1 STEP -1
oObj = oCollection.Item(i)
TRY
oObj.Release()
CATCH
FINALLY
?"Collection Count: " + ;
ALLTRIM(TRANSFORM(oCollection.Count))
ENDTRY
ENDFOR
?"Collection Count: " + ;
ALLTRIM(TRANSFORM(oCollection.Count))
DEFINE CLASS ObjWithRelease As Session
PROCEDURE Release
RELEASE THIS
ENDPROC
ENDDEFINE
DEFINE CLASS ObjNoRelease As Session
ENDDEFINE
DEFINE CLASS MyCollection As Collection
ENDDEFINE
Objects with a RELEASE method magically disappear from the collection when they are released. This makes for an easy way to keep track of opened threads when using Christof’s DMULT.DLL for multithreading. All I have to do is make sure my callback objects have a Release method, and periodically check the “ThreadManager” collection Count property to see how many threads may still be running.