When you set FreeOnTerminate = True , the thread object is automatically freed when it completes. Thus, after its completion, any further calls to this object are invalid. Once you call Terminate , you must assume that the object no longer exists.
If you need to perform further operations on a stream after it starts, do not install FreeOnTerminate . Instead, manually release it after you have actually finished using it.
The only time you would use Assigned is that you expect Thread1 be nil . Have you ever assigned Thread1 := nil ? If not, then you should not expect it to receive this value. As you should know, variables do not change their values when calling methods on them. But if you installed FreeOnTerminate , then it is also incorrect to check the Finished property, because it may have already finished and freed itself.
source share