0
I am developing a component (visual indicator) that to search the data in the database and generate the indicator itself uses a Thread. This Thread is inside the component itself. It works fine, except when I close the application and Thread is running. There occurs the error "Runtime 216".
Details:
- In the creation of Thread it is set as 
FreeOnTerminate; - If there is only one component (visual indicator) in the 
form, can close the application smoothly. The problem occurs when there is more than one component; 
Follows excerpt from the code:
constructor TWThread.Create(CreateSuspended: Boolean);  
begin  
  inherited Create(CreateSuspended);  
  FreeOnTerminate := True;  
  oQryThread      := TTIQuery.Create(nil);  
  oCdsThread      := TClientDataSet.Create(nil);  
  oDBThread       := TTIDatabase.Create(nil);  
end;
procedure TTIWidget.EventoOnTerminate(Sender: TObject);  
begin  
  if Assigned(oThread.oQryThread) then  
  begin  
    if oThread.oQryThread.Active then  
      oThread.oQryThread.Close;  
    FreeAndNil(oThread.oQryThread);  
    if Assigned(oThread.oCdsThread) then  
      FreeAndNil(oThread.oCdsThread);  
    if Assigned(oThread.oDBThread) then  
      FreeAndNil(oThread.oDBThread);  
  end;  
  oThread := nil;  
end;  
						
You could not terminate these threads in the Ondestroy event of the Form where the components are?
– Reginaldo Rigo
Yes, but I want to do something more generic so I don’t mess with the application where the components are. Thanks for the help.
– Andrey
You can descend all the Foms of your application from a generic form that checks whether these components are specifically running and attempts to terminate them.
– Reginaldo Rigo
You could post the Create/Execute/Terminate snippet from your thread ?
– Victor Tadashi
Edited question
– Andrey
How do you define the
FreeOnTerminate, what happens if you take theoThread := nil;?– Victor Tadashi