<div dir="ltr"><div class="gmail_extra">Just a bit of information, my Cross.Codebot library has threading built in to the socket protocol implementations, so with regards to explaining it I could just show the source code or I could write it a again just to demonstrate.</div><div class="gmail_extra"><br></div><div class="gmail_extra">With regards to complexity, I never define a new thread class, which is the typical way most people think about working with threads in Free Pascal. Instead I have one thread class defined in my System unit, and you pass it your execute method along with an optional status handler. Your execute is called, the thread object is freed for you automatically, and you don't need to declare a new type.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">procedure TDownloadForm.DownloadComplete(Thread: TSimpleThread);</div><div class="gmail_extra">begin</div><div class="gmail_extra">  FThread := nil;</div><div class="gmail_extra">  // Invoked in the user interface thread</div><div class="gmail_extra">  // Check Thread.Cancelled here</div><div class="gmail_extra">end;</div><div><br></div><div><div class="gmail_extra">procedure TDownloadForm.DownloadStatus(Thread: TSimpleThread);</div></div><div class="gmail_extra">begin</div><div class="gmail_extra">  // Invoked in the user interface thread</div><div class="gmail_extra">  // Do something with Thread.Status here</div><div class="gmail_extra">end;</div><div><br></div></div><div class="gmail_extra">procedure TDownloadForm.Download(Thread: TSimpleThread);</div><div class="gmail_extra">begin</div><div class="gmail_extra">  // Download here in a thread<br></div><div class="gmail_extra">  // Set Thread.Status := SomeString to sync status updates with the UI</div><div class="gmail_extra">  // FThread.Cancel cancels the thread</div><div class="gmail_extra">  // Throw exception cancels the thread</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">procedure TDownloadForm.DownloadClick(Sender: TObject);</div><div class="gmail_extra">begin</div><div class="gmail_extra">  if FThread <> nil then</div><div class="gmail_extra">    Exit;</div><div class="gmail_extra">  FThread := TSimpleThread.Create(Download, DownloadStatus, DownloadComplete);</div><div class="gmail_extra">end;</div></div>