Talking to a thread

I've used threads in the past to do an intensive process, like a sort or a file search. In each case, they've terminated with a result. That's fine.
But how do I talk to a thread to change its state, or to change its execution path, or to trigger it to do things?
I am thinking of an object that would normally be descended from TObject, but is now descended from TThread. Some form of state machine, but one that does some heavy but short term processing or network access when the state changes.
I also need it to have some form of event-based reporting to the main thread. Is there any way to make this work without it having to wait for the main thread? In either case, how do you do it?

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Your calling form could then set the event as follows:
with TMyThread.Create(True) do begin
MyEvent := DoMyThreadDone;
Resume;
end;

The form would then implement DoMyThreadDone:
procedure TForm1.DoMyThreadDone(Sender: TObject);
begin
ShowMessage('Thread Done');
// Note: The thread still exists at this point!!
// Thus you can access it via "TMyThread(Sender)"
end;

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.