Ciò accade la metà del tempo in cui si chiude la mia applicazione in cui ho inserito un TLMDHiTimer sul mio modulo in fase di progettazione, Abilitato su true. Nel mio evento OnFormClose, chiamo MyLMDHiTimer.Enabled: = false. Quando viene chiamato, a volte (circa la metà delle volte) ottengo questa eccezione.Che cos'è TExternalThread? "Impossibile terminare un thread creato esternamente" quando si termina un timer basato su thread
Ho eseguito il debug e sono entrato nella chiamata e ho rilevato che è la riga 246 in LMDTimer.pas a dare questo errore.
FThread.Terminate;
Sto usando l'ultima versione di LMDTools. Ho fatto una reinstallazione completa degli strumenti LMD prima del fine settimana e ho rimosso e aggiunto nuovamente il componente al modulo correttamente.
Da quello che ho trovato, questo ha qualcosa a che fare con TExternalThread, ma non c'è documentazione su di esso da Embarcadero e non ho trovato nulla che faccia riferimento al codice sorgente LMDTools.
Uso completamente aggiornato RAD Studio 2010, Delphi 2010.
Ciò che mi sconvolge è che non c'è nessuna documentazione di sorta. Google yeilds un risultato di che effettivamente ne parla, in cui qualcuno dice che l'errore è causato dal tentativo di terminare un TExternalThread. Ma guardando il codice sorgente di questo LMDHiTimer, non una volta mira a fare altro che creare un TThread regolare. Il risultato di un google che ho trovato, Thread: Cannot terminate an externally created thread? su Embarcadero menziona utilizzando GetCurrentThread() e GetCurrentThreadId() per ottenere i dati necessari per collegarsi a un thread esistente, ma TLMDHiTimer non fa nulla del genere. Crea semplicemente il proprio discendente TThread con il proprio costruttore Create() (sovrascritto, ovviamente, e le chiamate ereditate all'inizio del costruttore)
Quindi ... Che diavolo è questo TExternalThread? Qualcun altro si imbatte in questo tipo di eccezione? E forse hai trovato una soluzione o una soluzione? Ho chiesto quasi la stessa identica domanda al supporto di LMDTools, ma non può far male chiedere in più posti.
Grazie in anticipo per qualsiasi assistenza.
Ho fatto come hai detto, ma l'unica volta che viene attivato questo punto di interruzione è la distruzione del componente alla chiusura dell'applicazione. Ho premuto MAIUSC + F7 per tracciare il passaggio successivo nel codice sorgente (utilizzando debug dcus, così posso vedere anche tutte le classi delphi sottostanti) e lo stack di chiamate appare come segue: http: // pastebin. org/88904 Mi sembra che stia semplicemente distruggendo i componenti del modulo. –
Lo stack di chiamate visualizzato non è la distruzione del componente del timer. Sembra che sia la distruzione di qualche forma. Il campo FExternalThread era ancora False? Quale nuovo valore conteneva quella memoria quando il punto di interruzione dei dati è stato attivato? –
Sì, sembra che sia la distruzione del modulo principale della mia applicazione. Il componente Timer è posizionato su di esso, il che mi fa interpretare lo stack di chiamata come il componente distrutto durante la distruzione del modulo (il modulo dovrebbe distruggere tutti i componenti su di esso durante la distruzione, giusto?) Sembra che quando valuto il valore di l'indirizzo di FExternalThread, si presenta sempre come vero, anche quando il debugger delphi stesso afferma che è falso. Scrivo @FExternalThread e faccio booleano ($ Addess) in valutazione e diventa 'vero' anche durante la creazione quando solo FExternalThread restituisce 'false'. –