私はInternet Explorerのアドオンで非同期に関数を実行しようとしています(私はVC++でBHOを書いています)。提案通り、here私はCWorkerThreadを使用しようとしています。CWorkerThreadで簡単なバックグラウンドスレッドを書くには
私は何時間もそれを理解しようとしてきましたが、それをどうやって行うのかまだ分かりません。私はATLで多くの経験がありません。インターネット上の良い文書やチュートリアルの欠如は私を殺している。
私はAdd-> Classでクラスを作成していて、ATL Simple Objectを選択しています(ATLプロジェクトにクラスを追加する方法は?)。しかし、このIWorkerThreadClientを実装する方法は?私はクラスビューでAdd-> Implement Interfaceを選択すると良いと思ったが、リストにはIWorkerThreadClientはないと思った。
私はATLまたはCOM enaughについてはわかりませんが、これを学ぶための優れたリソースを見つけることはできないと思います(詳細最新 ATL7)。
私もwinapi CreateThread
アプローチを試みましたが、それは動作していません。私はthis
静的メソッドを実行するクラスポインタを渡していますが、後で何かがメモリで破損しています。それでも働いていたら、私はまだCreateThread
以外の何かを使用したいと思っています。
今私はthisのようなものを持っています。 OnDocumentComplete
にはRemoveImages(sptmlDoc)
があり、私はそれを非同期に実行したいだけです。
編集:私はCreateThread
でやった:
私は非同期的に(hereから)RemoveImages機能を実行してみました。私はhereのような署名で私のクラスの静的関数を作成しました。 RemoveImagesは、私はクラスのメンバにコピーし、次のパラメータがあります。
if (htmlDoc2 != NULL)
{
m_tmpHtmlDocument2 = htmlDoc2;
m_hThread = CreateThread(NULL, 0, MyThreadFunction, this, 0, &m_threadId);
}
とMyThreadFunction
:
static DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
CHelloWorldBHO* myClass = (CHelloWorldBHO*)lpParam;
myClass->RemoveImages(myClass->m_tmpHtmlDocument2);
return 0;
}
私はiexplore.exeをして0x60c0da05で」未処理の例外を取得:0xc0000005で:アクセス違反読み取り場所0x000001b8 "ここでは太字で示しています。
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); } }
あなたは[この1](http://www.codeproject.com/KB/threads/CWorkerThreadのような例を見てみたのを持って整列化の問題が解決しません.aspx)? –
はい、私はしました。私はこれと[this](http://msdn.microsoft.com/en-us/library/w849dybf.aspx)はこのクラスに関する "良い"ソースだと思います。 しかし、私はこれに問題があります。私は "エラーC2504: 'IWorkerThreadClient':基本クラスが定義されていないので、' IWorkerThreadClient'を実装する単純なクラスを作成することすらできず、 '#include'を追加しています。私はadd-> class-> Atl単純オブジェクトによって作成されたオブジェクトにしか実装できません。なぜ私は 'IWorkerThreadClient'インターフェースへのポインタを' AddHandle'に渡すことができないのか、後でそれを使うことはできません。 –