Se non si ha esperienza con il multi-threading, probabilmente non si dovrebbe iniziare con TThread
, poiché è un sottile strato sul thread nativo. Lo considero anche un po 'ruvido intorno ai bordi; non si è evoluto molto dall'introduzione con Delphi 2, principalmente modifiche per consentire la compatibilità con Linux nel frame di tempo Kylix e per correggere i difetti più evidenti (come la correzione della classe MREW rotta e infine la deprecazione di Suspend()
e Resume()
nell'ultima versione Versione Delphi).
L'utilizzo di una semplice classe di thread wrapper consente inoltre allo sviluppatore di concentrarsi su un livello troppo basso. Per fare un uso corretto di più core della CPU, è meglio concentrarsi sulle attività anziché sui thread, perché il partizionamento del lavoro con i thread non si adatta bene ai requisiti e agli ambienti in evoluzione, a seconda dell'hardware e dell'altro software che esegue in parallelo il numero ottimale di i thread possono variare notevolmente, anche in momenti diversi sullo stesso sistema. Una libreria a cui si passano solo blocchi di lavoro e che li programma automaticamente per sfruttare al meglio le risorse disponibili aiuta molto a questo proposito.
AsyncCalls è un buon primo passo per introdurre i thread in un'applicazione. Se nel tuo programma ci sono diverse aree in cui è necessario eseguire una serie di passaggi che sono indipendenti l'una dall'altra, è sufficiente eseguirle in modo asincrono trasferendole su AsyncCalls. Anche quando si dispone di una sola azione dispendiosa in termini di tempo, è possibile eseguirla in modo asincrono e mostrare semplicemente un'interfaccia utente di avanzamento nel thread VCL, facoltativamente consentendo di annullare l'azione.
AsyncCalls è IMO non è così buono per gli utenti in background che restano intorno durante l'intero runtime del programma e potrebbe essere impossibile da utilizzare quando alcuni degli oggetti nel programma hanno affinità di thread (come connessioni di database o oggetti OLE che potrebbero avere un requisito che tutte le chiamate avvengano nello stesso thread).
Ciò che è necessario tenere presente è che queste azioni asincrone sono non del tipo "fire-and-forget".Ogni funzione sovraccaricata di AsyncCall()
restituisce un puntatore all'interfaccia IAsyncCall
di cui potrebbe essere necessario conservare un riferimento se si desidera evitare il blocco. Se non si mantiene un riferimento, il momento in cui il conteggio ref raggiunge lo zero verrà liberata l'interfaccia, il che farà sì che il thread rilasciando l'interfaccia attenda il completamento della chiamata asincrona. Questo è qualcosa che potresti vedere durante il debug, quando uscire dal metodo che ha creato il IAsyncCall
potrebbe richiedere una quantità di tempo misteriosa.
OTL è a mio parere la più versatile delle tre opzioni e la userei senza pensarci due volte. Può fare tutto TThread
e AsyncCalls può fare, oltre a molto altro ancora. Ha un design sonoro, che è abbastanza di alto livello sia per rendere facile la vita per l'utente, sia per lasciare una porta su un sistema Unix (mantenendo intatta la maggior parte dell'interfaccia) almeno quanto meno possibile, se non addirittura facile. Negli ultimi mesi ha anche iniziato ad acquisire alcuni costrutti di alto livello per il lavoro parallelo, altamente raccomandato.
Anche OTL ha alcune dozzine di campioni, il che è importante per iniziare. AsyncCalls non ha che poche righe nei commenti, ma è abbastanza facile da capire a causa della sua funzionalità limitata (fa solo una cosa, ma lo fa bene). TThread
ha un solo campione, che non è realmente cambiato in 14 anni ed è principalmente un esempio di come non fare le cose.
Qualsiasi delle opzioni scelte, nessuna libreria eliminerà la necessità di comprendere le nozioni di base sui thread. Avere letto un buon libro su questi è un prerequisito per qualsiasi codice di successo. Ad esempio, un blocco appropriato è un requisito per tutti loro.
Ottima risposta. Sto appena iniziando ad esplorare l'aggiunta di threading alla mia applicazione che ha alcune conversazioni a volte lunghe con il mio database e voglio davvero che si fermi lì seduto come un oratore pubblico che ha perso la sua discussione. Avevo bisogno di questo tipo di panoramica. – jrodenhi