2016-11-22 18 views
0

私は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); 
} 
  1. std::thread.hファイル
  2. で宣言されています。

私はエラーを出さなかった同期機能Generateを実行したので、これはメモリのスレッドの削除に問題があることを知っています。

しかし、私はこのスレッドを削除し、Clientがobjを削除したいときに検出できますか?もう1つは、スレッドアシスタントがもはや動かなくなったときにメモリを解放することに問題がある理由を理解できないことです。

+0

QRCodeGeneratorのデストラクタで何かできますか? –

+0

@ TonyJの権利、しかしwhitchとは何ですか? クライアントがobjを破棄するとWhitchメソッドが呼び出されますか? HRESULT FinalConstruct()/ void FinalRelease()?そして何 ? t.join()? – Kuba

+0

私はFinalConstruct()/ FinalRelease()に精通していませんが、スレッドが終了していなければt.join()を呼び出す関数を書くと、FinalConstruct()/ FinalRelease()とdesctructorから呼び出すことができます。また、CQRCodeGeneratorをリファクタリングしてラッパークラスにすることもできます。そのため、スレッドは結合されません。 –

答えて

2

スレッドを破棄する前にstd::thread::join()またはdetach()に電話しますか?さもなければ、std::threadデストラクタはterminate()をトリガし、プログラムを中止するはずです。

(示唆「クライアントは、スレッドがすでにを行っているオブジェクトクラスを削除しようとする」のように)何かがスレッドを所有している場合は、オブジェクトは、例えば、そのデストラクタでt.join()を呼ぶかもしれません。

Fire_OnGenerateのオブジェクトを破棄しないでください。実行中のスレッドのスコープで呼び出されます。だから、基本的にまだ実行中のスレッドを破棄します(Fire_OnGenerateが返された後にしか完了できません)。

+0

私はイベントがOnGenerateを返す状況について話しています。 ATLクラスでt.join()を追加する必要がある場所はどこですか? HRESULT FinalConstruct()? FinalRelease?クライアントがobjを破棄しようとすると、私はwhitchメソッドが呼び出されるのを知らない。 – Kuba

関連する問題