gpt4 book ai didi

c++ - 哪些是从线程通过 PostMessage 发送 CString 的安全方法

转载 作者:太空狗 更新时间:2023-10-29 20:35:36 25 4
gpt4 key购买 nike

从线程通过 PostMessage 发送 CString 的安全/最佳方法是什么?要在堆上创建 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);

以上两种解决方案都安全吗?请感谢您的任何解释。

最佳答案

第一个选项是更安全的选择。* 这可能导致资源泄漏的唯一原因是,如果对 ::PostMessage 的调用失败,并且您没有在发件人中清理。请注意,这不会导致崩溃。

第二个选择创建了一个竞争条件,因为你持有一个指针,你打算转移它的所有权。如果 GUI 线程在线程对象被销毁后尝试访问该字符串,则您正在访问随机内存。如果幸运的话,这可能会导致立即崩溃。

根据您的具体用例,您可能需要考虑使用第三种选择:使用具有自动存储持续时间和通过消息发送进行线程同步的 CString 对象,例如:

CStringW err( L"Unknown error" );
::SendMessage( ..., (LPARAM)&err );

只要字符串对象在其消息处理程序中,接收线程就可以使用该字符串对象,发送方将自动清理该资源。


* 假设两个线程都在同一个模块中实现。请务必阅读 Potential Errors Passing CRT Objects Across DLL Boundaries以防万一。

关于c++ - 哪些是从线程通过 PostMessage 发送 CString 的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42086388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com