J'essaie d'exécuter de manière asynchrone la fonction dans mon add-on pour Internet Explorer (j'écris BHO dans VC++). Comme suggéré here J'essaie d'utiliser CWorkerThread.Comment écrire un thread d'arrière-plan simple dans CWorkerThread
J'ai essayé de le comprendre pendant des heures mais je n'ai toujours aucune idée de comment le faire. Je n'ai pas beaucoup d'expérience en ATL. Le manque de bonnes documentations ou de tutoriels sur Internet me tue.
Je crée classe par Add-> Class et en choisissant ATL Simple Object (c'est ainsi que vous ajoutez correctement le projet ATL classifié?). Mais comment implémenter ce IWorkerThreadClient? Je pensais que le choix de Ajouter -> Implémenter l'interface dans la vue de classe serait bon mais il n'y a aucun IWorkerThreadClient sur la liste.
Je pense que je ne sais pas ATL ou COM enaugh, mais ne peut pas trouver une bonne ressource pour apprendre cela (ESSPESSIALY plus récent ATL7).
J'ai même essayé l'approche winapi CreateThread
mais ça ne fonctionne pas. Je passe le pointeur de classe this
pour exécuter la méthode statique mais quelque chose est corrompu avec la mémoire plus tard. Néanmoins, si cela avait fonctionné, je préfère encore utiliser autre chose que CreateThread
.
En ce moment j'ai quelque chose comme this. Dans OnDocumentComplete
il y a RemoveImages(sptmlDoc)
et je veux juste l'exécuter de manière asynchrone.
EDIT: Ce que je l'ai fait avec CreateThread
:
J'ai essayé en cours d'exécution fonction RemoveImages (de here) de manière asynchrone. J'ai créé la fonction statique dans ma classe avec la signature comme here. RemoveImages a paramètre si je l'ai copié à un membre d'une classe:
if (htmlDoc2 != NULL)
{
m_tmpHtmlDocument2 = htmlDoc2;
m_hThread = CreateThread(NULL, 0, MyThreadFunction, this, 0, &m_threadId);
}
et MyThreadFunction
:
static DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
CHelloWorldBHO* myClass = (CHelloWorldBHO*)lpParam;
myClass->RemoveImages(myClass->m_tmpHtmlDocument2);
return 0;
}
je reçois « exception non gérée à 0x60c0da05 en iexplore.exe: 0xC0000005: violation d'accès lecture emplacement 0x000001b8 " ici dans la ligne en gras:
void CHelloWorldBHO::DontDisplayElement(CComPtr htmlElement) { CComPtr style; HRESULT hr = htmlElement->get_style(&style); if (hr == S_OK && style != NULL) { static const CComBSTR strNone(L"none"); style->put_display(strNone); } }
Avez-vous jetez un oeil à des exemples comme [celui-ci] (http://www.codeproject.com/KB/threads/CWorkerThread .aspx)? –
Oui, je l'ai fait. Je pense que ceci et [ceci] (http://msdn.microsoft.com/en-us/library/w849dybf.aspx) sont seulement de "bonnes" sources à propos de cette classe. Mais j'ai des problèmes avec ça. Je ne peux même pas créer une classe simple qui implémente 'IWorkerThreadClient' car j'obtiens l'erreur C2504: 'IWorkerThreadClient': classe de base indéfinie" et j'ajoute '#include'. Je ne peux l'implémenter que dans des objets créés par add-> class-> Atl Simple Object. Par Je ne peux pas l'utiliser plus tard parce que je ne peux pas obtenir un pointeur sur l'interface 'IWorkerThreadClient' pour le passer à' AddHandle'. –