私はATL DLLを作成しました。std::thread
の魔法使いに問題があります。asyn
メソッドを実行しました。非同期に操作を実行するメソッドを実装しました。この問題は、クライアントがすでに完了しているオブジェクトクラスを削除しようとしたときに発生します。安全にATL DLLのstd :: threadを削除するには
これは私のコードです:I受信イベントと私はエラーを取得するOBJ QRCodeGenerator
を削除しようとすると、
STDMETHODIMP CQRCodeGenerator::GenerateAsync(QRCodeTypeEnum QRCodeType, QRCodeFormatEnum QRCodeFormat, LONG QRCodePx, BSTR ImageFile)
{
if (ImageFile == nullptr) ImageFile = L"";
//stack to log file
OPFHelper::add_execute_method(this, L"CQRCodeGenerator::GenerateAsync",
std::vector<std::wstring>{OPFHelper::ConvertToWSting((LONG)QRCodeType),
OPFHelper::ConvertToWSting((LONG)QRCodeFormat), OPFHelper::ConvertToWSting((LONG)QRCodePx), ImageFile});
t = std::thread(&CQRCodeGenerator::run, this, QRCodeType, QRCodeFormat, QRCodePx, ImageFile);
return S_OK;
}
void CQRCodeGenerator::run(enum QRCodeTypeEnum QRCodeType, enum QRCodeFormatEnum QRCodeFormat, LONG QRCodePx, BSTR ImageFile)
{
......
Fire_OnGenerate(this,ImageFile, _pQRCode, _pInvoiceID, _pQRCodeMD5, _pKS,nullptr);
}
std::thread
は.h
ファイル- で宣言されています。
私はエラーを出さなかった同期機能Generate
を実行したので、これはメモリのスレッドの削除に問題があることを知っています。
しかし、私はこのスレッドを削除し、Client
がobjを削除したいときに検出できますか?もう1つは、スレッドアシスタントがもはや動かなくなったときにメモリを解放することに問題がある理由を理解できないことです。
QRCodeGeneratorのデストラクタで何かできますか? –
@ TonyJの権利、しかしwhitchとは何ですか? クライアントがobjを破棄するとWhitchメソッドが呼び出されますか? HRESULT FinalConstruct()/ void FinalRelease()?そして何 ? t.join()? – Kuba
私はFinalConstruct()/ FinalRelease()に精通していませんが、スレッドが終了していなければt.join()を呼び出す関数を書くと、FinalConstruct()/ FinalRelease()とdesctructorから呼び出すことができます。また、CQRCodeGeneratorをリファクタリングしてラッパークラスにすることもできます。そのため、スレッドは結合されません。 –