I put message objects in a thread safe queue (tthreadlist or tlist protected by criticalsection), and let the thread block on an TEvent.
If I put objects in the queue, I .Setevent the Tevent, and the thread drains the queue. If it is empty, it resets the tevent and blocks on it again.
This is fine for not too finegrained threading.