如何安全/最佳地通过线程从CString
发送PostMessage
?
创建堆上的CString
并在接收者获取此CString
时清理,这是最好的方法吗?
解决方案1:在线程中:
CString* pError = new CString(_T("Unknown error"));
::PostMessage(...(LPARAM)pError);
在主线程中,在GUI的某个地方:
CString* pError = (CString*)lParam;
GetDocument()->DoSomething(*pError);
delete pError;
解决方案2:
或者,将CString
对象作为CThread
类的成员变量保留?
class CPlanThread : public CThread [: public CObject]
{
public:
DECLARE_DYNAMIC(CPlanThread)
...
protected:
CString* m_pMessage;
};
并且。
CPlanThread::CPlanThread()
:m_pMessage(NULL)
{
m_pMessage = new CString(_T(""));
}
CPlanThread::~CPlanThread()
{
if(NULL != m_pMessage)
delete m_pMessage;
}
并且在某个线程中:
::PostMessage(m_hWndMain, WMU_NOTIFYTHREAD, 0, (LPARAM)m_pMessage);
在主线程中,某个GUI界面的位置:
CString* pError = (CString*)lParam;
GetDocument()->DoSomething(*pError);
以上两种解决方案都是安全的吗?感谢您的任何解释。
std::unique_ptr
并不能带来任何好处,因为你正在转移所有权。PostMessage
调用将立即在其上调用release()
,发送方无法保留所有权而不进行额外的同步(例如通过SendMessage
)。此时,为什么要建议将std::unique_ptr
用于CString*
,而不是使用具有自动存储期的CString
对象呢? - IInspectable