2010-04-04 9 views
10

Il mio programma Delphi si basa molto sull'automazione di Outlook. Le versioni di Outlook precedenti a 2007-SP2 tendono a rimanere bloccate in memoria a causa di aggiunte errate e codice Outlook scritto male.Se terminare un thread appeso è una buona idea, come posso farlo in sicurezza?

Se Outlook è bloccato, la chiamata a CreateOleObject ('Outlook.Application') o GetActiveObject ... non ritorna e mantiene sospesa l'applicazione fino a quando Outlook.exe non viene chiuso nel task manager.

Ho pensato a una soluzione, ma non sono sicuro che si tratti di buone pratiche o meno.

Avvio Outlook con CreateOleObject in un thread separato, attendere 10 secondi nel thread principale e se Outlook si blocca (CreateOleObject non viene restituito), offrire all'utente di interrompere il processo Outlook.exe dal mio programma.

Ma poiché non voglio forzare l'utente per terminare il processo Outlook.exe, in alternativa ho anche bisogno di un modo per eliminare il nuovo thread nel mio programma che continua a essere sospeso.

  1. Questa è una buona pratica?
  2. Come posso terminare un filo sospeso in Delphi senza perdite di memoria?
+2

"scritto male" sarà considerata sia come infiammatoria da alcuni, o come ridondante da quelli di noi che hanno affrontato questi prima. Condivido il tuo dolore, fratello ... –

risposta

10

Windows ha una funzione TerminateThread, ma come potete vedere dalle osservazioni, non è generalmente una buona idea usarlo. Un approccio più sicuro sarebbe quello di avere un'applicazione secondaria che interagisce con Outlook, e si potrebbe quindi ucciderlo senza compromettere la stabilità della propria applicazione. TerminateProcess funzionerebbe, ma se si desidera essere un po 'più amichevole con il sistema, Dr. Dobbs ha un article su un approccio possibilmente più sicuro utilizzando ExitProcess.

Se il blocco è costante e si verifica sempre o non si verifica, è sufficiente chiamare CreateOleObject nell'app e uscire, quindi richiamarlo di nuovo. Se è incoerente, l'applicazione secondaria potrebbe essere un wrapper più completo e tutte le interazioni lo attraverserebbero.

+0

Grazie, non pensavo a un'applicazione separata, ma questo ha risolto completamente il mio problema. Sto usando ShellExecuteEx per lanciare l'altra app (che ha una sola chiamata a CreateOleObject) e se l'app generata non ritorna, termino Outlook o l'app su richiesta dell'utente. – Steve

Problemi correlati