COM: la chiamata da un altro thread provoca arresti anomali, come eseguirlo nello stesso thread?

StackOverflow https://stackoverflow.com/questions/199972

  •  11-07-2019
  •  | 
  •  

Domanda

Sto facendo un BHO (estensione per IE) che riceve eventi su un altro thread. Quando accedo al DOM da quell'altro thread, IE si arresta in modo anomalo. È possibile effettuare l'accesso al DOM dallo stesso thread del thread BHO principale in modo che non si blocchi?

Sembra un problema generale di multithreading COM, che non capisco molto.

È stato utile?

Soluzione

Cerca di utilizzare CoMarshalInterface o CoMarshalInterThreadInterfaceInStream

Questi ti daranno un'interfaccia chiusa a un oggetto COM STA che è thread-safe.

Altri suggerimenti

Non so molto sulle estensioni di IE, ma sembra che alcuni oggetti COM debbano essere contrassegnati come Single Threaded Apartment, in modo che il sistema di runtime COM assicuri che venga eseguito sullo stesso thread che lo ha chiamato inizialmente. Se non riesci a modificare l'altro oggetto, puoi probabilmente indirizzare le tue chiamate al DOM attraverso un oggetto COM separato contrassegnato come STA per ottenere lo stesso effetto. Spero che questo aiuti ... Conosco un po 'di multithreading COM, ma non molto sulle estensioni di IE.

ah, divertente divertente divertente multithreading con COM.

La risposta di Gerald sembra corretta se si desidera trasferire un puntatore all'interfaccia da un thread all'altro esattamente una volta. Ho scoperto che la GIT (tabella di interfaccia globale) è di grande aiuto per questo genere di cose se ti trovi in ??un sistema multithread ... in pratica non tieni i puntatori all'interfaccia ma piuttosto i cookie DWORD usati da GIT per ottenere un puntatore all'interfaccia con marshalling appropriato per qualsiasi thread lo si sta utilizzando. (devi prima registrare l'oggetto in questione con GIT e annullare la registrazione in seguito quando hai finito o l'oggetto è finito)

Stai attento però. Le prestazioni possono diventare un problema serio.

Se stai solo giocando per conoscere i BHO, puoi usare STA per far funzionare il tuo oggetto di implementazione :: SetSite () come se fosse un thread singolo (questo ti permette di lasciare che altri thread tirino fuori il puntatore del tuo BHO della GlobalInterfaceTable come menzionato da @JasonS.

Se stai facendo qualcosa che dovrebbe far parte di un prodotto, ti consiglio vivamente di riconsiderare attentamente l'MTA ovunque tu sia e di gestire tu stesso i problemi di concorrenza e sicurezza dei thread. In questo caso dovresti solo assicurarti che i thread che interagiscono con il tuo oggetto COM BHO siano stati essi stessi inizializzati per COM.

Ad esempio, se si desidera monitorare i dati in entrata / in uscita del sito Web alla ricerca di cose (pericolose o sensibili) - NON si desidera forzare tutti quei thread nella gola di un oggetto STA perché, usando Yahoo come un esempio, verranno avviate più di 30 richieste e il tuo BHO inizierà a bloccare IE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top