【发布时间】:2017-04-06 18:22:33
【问题描述】:
我写了一个 ATL DLL,但我遇到了 std::thread 的问题,我曾经运行 asyn 方法。我实现了异步执行操作的方法。当客户端尝试删除已完成线程的对象类时,就会出现此问题。
这是我的代码:
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文件中声明 - 当我收到事件并尝试删除 obj
QRCodeGenerator时出现错误。
我知道这是内存线程移除的问题,因为我执行了同步函数Generate,没有报错。
但我不知道如何删除这个线程并检测Client 何时想要删除 obj。第二件事它无法理解为什么当线程助手不再工作时释放内存会出现问题。
【问题讨论】:
-
你可以在 QRCodeGenerator 的析构函数中做点什么吧?
-
@TonyJ 对,但是 whitch 怎么办?客户端销毁 obj 时调用哪个方法? HRESULT FinalConstruct() / void FinalRelease() ?什么? t.join() ?
-
我不熟悉FinalConstruct()/FinalRelease(),但是如果你写一个函数来调用t.join()如果线程没有完成,那么你可以从FinalConstruct()调用它/FinalRelease() 和析构函数。或者,您可以将 CQRCodeGenerator 重构为只是一个包装类,因此线程不会与其耦合。
-
@TonyJ 感谢您的建议!
标签: c++ multithreading atl stdthread