Terminate and Terminated are a function resp. a flag. The most important thing with threads is probably waitfor which many of you do not have the patience for.
Don't use WaitFor in an interactive (e.g. GUI) application, because it will block the main thread. Use
OnTerminate or
FreeOnTerminate instead.
The main problem with waiting after calling terminate is that it can take arbitrary long until the thread finishes, as terminate is just a "hint" that you would like for the thread to somewhen in the future, when it has time to do so, stop prematurely.
If you are in an HTTP request with a timeout of 5 seconds, your terminate will not have any effect for 5 seconds. I've worked with HTTP based protocols where the http request would trigger a User input before returning, where the timeout is in the order of minutes.
So when you call WaitFor after Terminate you may freeze your main thread for a few seconds up to minutes or even indefinitely, depending on what your thread is currently doing.
Also I would argue that there is generally speaking very rarely the need to use WaitFor at all. If you don't need the result of a thread, the best you can do is setting FreeOnTerminate then call terminate and just "throw the thread away". It will finish all on its own and when it does so it will free itself, meaning you don't have to care about it anymore.
If you need partial results, use the OnTerminate event, to react to the thread finishing without waiting for it.
Only use WaitFor is a few cases, first If you have a batch application, which has nothing better to do than waiting, second when you are in the cleanup of your program (i.e. the user wants to close) and your UI is already being destroyed/you don't get any new events in that you are blocking by WaitFor. But in any normal interactive program flow, do not use WaitFor on the main thread at any time