【发布时间】:2017-06-24 11:49:47
【问题描述】:
从线程发送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);
以上两种解决方案都安全吗?非常感谢您的任何解释。
【问题讨论】:
-
我认为在第一个解决方案中,主线程可能无法处理消息,这将导致崩溃......
-
解决方案 1,但将其捕获在 unique_ptr 中,这样您就不会忘记删除它。
-
如果我在 VC6 上使用这个解决方案,我在那个编译器上没有 unique_ptr 怎么办?
-
@flaviu2:那我建议升级你的编译器。今天还有VC6发布后出生的大人!
-
@TomTom:这可能看起来更简单,但现在您需要与线程通信,使用该指针指向它不拥有的对象的安全时间。而且您还需要同步访问,因为您不希望工作线程在其析构函数运行到一半时使用该对象。如果您正在寻找简单安全的解决方案,请参阅this anwers。
标签: c++ multithreading visual-c++ mfc thread-safety