Non ho molta esperienza con i componenti Indy, ma ho fatto uso molto spesso dei thread e mi è capitato di dover utilizzare componenti al loro interno.
Ciò che posso dirti (ma che forse sai già) è che la VCL, quindi la libreria di classi sulla quale si basano anche i componenti Indy, è stata progettata per un uso mono-thread.
La scelta di questa impostazione nello sviluppo è giustificata dal fatto che la maggior parte delle applicazioni che vanno a creare gli sviluppatori contengono un thread solo, quello dell'applicazione stessa, e gestiscono le varie interazione con l'utente utilizzando gli eventi preposti o intercettando messaggi di Windows.
Questa premessa è necessaria per scoraggiare qualsiasi uso di componenti che si trovano sui form da parte dei thread. Ciascun thread che vai a creare viene eseguito in modo asincrono rispetto al thread principale dell'applicazione (quello che raccoglie e gestisce i messaggi inseriti nella coda dell'applicazione stessa).
Pertanto, una chiamata ad un metodo che appartiene ad un componente al quale si fa accesso sia dal thread principale che da quello secondario potrebbe generare una situazione di stallo o dare luogo ad effetti collaterali quasi impossibili da individuare, specialmente quando il programma viene eseguito passo per passo in fase di debugging.
Il mio suggerimento è questo: creare un thread che esegua la stessa operazione che veniva precedentemente gestita dalla tua applicazione, ma creando dinamicamente i componenti Indy necessari all'interno del thread, senza utilizzare quelli eventualmente già presenti nei form dell'applicazione. In questo modo, eviti di doverti gestire l'accesso concorrente alle risorse condivise.
Come secondo alternativa, potresti scegliere di gestire accessi concorrenti mediante dei Mutex (sono simili ai semafori), i quali servono a garantire che solo un thread alla volta prenda possesso di una risorsa e la rilasci al termine dell'elaborazione per renderla disponibile ad altri thread; nel nostro caso, la "risorsa" da proteggere è la chiamata al metodo che impiega lungo tempo per completarsi, ma sconsiglierei quest'ultima soluzione poichè il programma principale arriverebbe a bloccarsi di nuovo se tentasse di chiamare il metodo nel momento in cui è in uso dal thread secondario.
Spero di non averti creato troppa confusione...
Tutto questo a livello teorico, poi se ho indovinato la problematica e la possibile soluzione, dimmi qualcosa e vedremo come implementarla dal lato pratico.
Ciao!![]()